programing

동적 버튼 클릭 이벤트 핸들러

goodsources 2023. 5. 31. 15:52
반응형

동적 버튼 클릭 이벤트 핸들러

양식에서 동적으로 생성된 버튼이 100개 있습니다.이벤트 핸들러를 추가하려면 어떻게 해야 합니까?

AddHandler를 사용하여 모든 이벤트에 대한 처리기를 추가할 수 있습니다.

예를 들어, 다음과 같습니다.

AddHandler theButton.Click, AddressOf Me.theButton_Click

리드의 대답을 요약하자면, 당신은 다음 중 하나를 얻을 수 있습니다.Button에서 온 물체Form또는 다른 컨테이너를 추가하고 핸들러를 추가하거나, 또는 당신이 만들 수 있습니다.Button프로그래밍 방식으로 개체를 표시합니다.
만약 당신이 그것을 얻는다면.Button에서 온 물체Form또는 다른 용기, 그러면 당신은 위에서 반복할 수 있습니다.Controls의 수집.Form또는 다음과 같은 기타 컨테이너 제어Panel또는FlowLayoutPanel등등.그런 다음 클릭 핸들러를 추가할 수 있습니다.
AddHandler ctrl.Click, AddressOf Me.Button_Click(아래 코드와 같이 표시)
하지만 나는 그것의 종류를 확인하는 것을 선호합니다.Control그리고 a에 캐스팅.Button컨테이너의 다른 컨트롤(예: 레이블)에 대한 클릭 핸들러를 추가하지 않습니다.모든 이벤트에 대해 처리기를 추가할 수 있습니다.Button이 시점에서 사용하여AddHandler.
또는 다음을 생성할 수 있습니다.Button아래의 두 번째 코드 블록에서와 같이 프로그래밍 방식으로 개체를 표시합니다.
그렇다면 당연히 아래의 세 번째 코드 블록과 같이 핸들러 메소드를 작성해야 합니다.

다음은 다음을 사용한 예입니다.Form용기로, 하지만 당신은 아마도 사용하는 것이 더 나을 것입니다.Panel또는 다른 컨테이너 제어.

Dim btn as Button = Nothing
For Each ctrl As Control in myForm.Controls
    If TypeOf ctrl Is Button Then
        btn = DirectCast(ctrl, Button)
        AddHandler btn.Click, AddressOf Me.Button_Click   ' From answer by Reed.
    End If
 Next

또는 다음을 생성합니다.Buttons 프로그래밍 방식으로, 이번에는 에 추가Panel컨테이너.

Dim Panel1 As new Panel()
For i As Integer = 1 to 100
    btn = New Button()
    ' Set Button properties or call a method to do so.
    Panel1.Controls.Add(btn)  ' Add Button to the container.
    AddHandler btn.Click, AddressOf Me.Button_Click   ' Again from the answer by Reed.
Next

그러면 당신의 핸들러는 이렇게 보일 것입니다.

Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
    ' Handle your Button clicks here
End Sub

@Debasish Sahu, 당신의 대답은 다른 질문에 대한 대답입니다. 즉, 두 개의 컨트롤에 대한 공통 핸들러가 있을 때 어떤 버튼(또는 다른 컨트롤)이 클릭되었는지 어떻게 알 수 있습니까?그래서 이 질문에 대한 답을 드리려고 하는데, 이 질문은 당신의 질문과 거의 동일하지만 동일한 유형의 컨트롤을 처리할 때는 형식 변환 없이도 작동합니다.

Private Sub btn_done_clicked(ByVal sender As System.Object, ByVal e As System.EventArgs)
    Dim selectedBtn As Button = sender
    MsgBox("you have clicked button " & selectedBtn.Name)
End Sub

스위치 케이스를 사용하지 않고 어떤 버튼에서 호출되는지 보여줄 수 있는 공통 이벤트 핸들러가 필요했습니다.이런 식으로..

  Private Sub btn_done_clicked(ByVal sender As System.Object, ByVal e As System.EventArgs)

    MsgBox.Show("you have clicked button " & CType(CType(sender,  _
    System.Windows.Forms.Button).Tag, String))

  End Sub

이 문제에 대한 변형 코드입니다.위의 코드를 사용하여 필요에 따라 클릭 이벤트를 얻었지만, 어떤 버튼이 클릭되었는지 확인하는 데 어려움을 겪었습니다.제 시나리오는 동적인 탭 페이지 수입니다.각 탭 페이지에는 차트 2개, DGV 2개, 라디오 버튼 한 쌍이 있습니다(모두 동적으로 생성됨).각 컨트롤은 탭과 관련된 고유한 이름을 가지고 있지만 탭 페이지가 20개인 경우 동일한 이름의 라디오 단추가 20개 있을 수 있습니다.라디오 버튼은 두 개의 그래프와 DGV 중 어느 것을 볼 수 있는지 전환합니다.다음은 라디오 버튼 중 하나를 선택한 경우의 코드입니다(차트와 DGV를 다시 스왑하는 거의 동일한 블록이 있음).

   Private Sub radioFit_Components_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)

    If sender.name = "radioFit_Components" And sender.visible Then
        If sender.checked Then
            For Each ctrl As Control In TabControl1.SelectedTab.Controls
                Select Case ctrl.Name
                    Case "embChartSSE_Components"
                        ctrl.BringToFront()
                    Case "embChartSSE_Fit_Curve"
                        ctrl.SendToBack()
                    Case "dgvFit_Components"
                        ctrl.BringToFront()
                End Select
            Next

        End If
    End If

End Sub

이 코드는 모든 탭 페이지에 대해 실행되고 모든 탭 페이지에서 차트와 DGV를 전환합니다.sender.visible 검사는 폼을 만들 때 코드 실행을 중지하는 것입니다.

언급URL : https://stackoverflow.com/questions/7375061/dynamic-button-click-event-handler

반응형