2016-12-11 3 views
-3

약 50 개의 레이블이있는 응용 프로그램이 있습니다. 이 레이블에는 숫자가 표시됩니다. 사용자가 라벨을 클릭하면 번호를 입력란에 기록해야합니다. 괜찮습니다. 유일한 문제는 아래와 같이 50 개 기능을 추가했으며 매번 동일합니다. 이 공통 기능이 있는지 궁금합니다. 참고 : 레이블의 이름이 다릅니다. 그래서 이것이 가능한 경우 폼의 모든 레이블에 대해 작동합니다.레이블의 클릭 이벤트

Private Sub LI_L_Click(sender As Object, e As EventArgs) Handles LI_L.Click 
    cmbOBJID.Text = LI_L.Text 
End Sub 
+0

레이블에는 다른 레이블과 구분하기 위해 공통된 것이 있습니다 (예 : 모두 그룹 상자에 있음). –

+0

모두 같은 위치에 쓰는 경우 모든 레이블을로 나열하여이 코드를 단순화 할 수 있습니다. . . LI_L.Click, LI_M.click을 처리합니다. . . . 등등. 그런 다음 특정 레이블을 sender.text – peterG

+2

으로 바꾸십시오.이 문서를 확인하십시오. [MSDN] (https://msdn.microsoft.com/en-us/library/aa289500(v=vs.71).aspx) – Abood

답변

0

폼 디자이너에서 모든 레이블의 처리기를 동일한 기능으로 설정할 수 있어야합니다. 그런 다음 "발신자"매개 변수를 사용하여 어떤 라벨이 이벤트를 발생시키고 있는지 확인할 수 있습니다. 함수에 연결된 모든 컨트롤이 "핸들"키워드 다음에 나와있는 방법도

enter image description here

알 수 있습니다. 이는 Visual Studio UI 속성 표를 사용하여 모든 레이블에 코드를 연결할 수있는 또 다른 방법입니다.

Private Sub LI_Click(sender As Object, e As EventArgs) Handles Label1.Click, Label2.Click, Label3.Click 
    cmdOBJID.Text = DirectCast(sender, Label).Text 
End Sub 
+0

왜 투표가 실패 했습니까? 그것은 아주 좋은 대답이고 사용하기 쉽습니다. 이벤트 처리기에 추가하려는 모든 레이블을 선택하고 위의 지침을 따르고 무차별 루프의 함정을 피하십시오. upvoting. –

0

그것은 단지 몇 라벨 이상 지루한 것

Private Sub LI_Click(sender As Object, e As EventArgs) Handles Label1.Click, Label2.Click, Label3.Click 

의 스타일로 하나의 핸들러에 여러 이벤트를 쉽게 추가 할 수 있지만.

핸들러를 추가해야하는 레이블을 참조 할 수있는 방법을 찾을 수 있으면 프로그램 방식으로 핸들러를 추가 할 수 있습니다. 당신은 핸들러를 사용하는 라벨을 선택하는 다른 방법이있을 수 있습니다

Option Infer On 
Option Strict On 

Public Class Form1 

    Sub TransferDataToEditBox(sender As Object, e As EventArgs) 
     Dim lbl = DirectCast(sender, Label) 
     tbEditThis.Text = lbl.Text 

    End Sub 

    Sub InitLabelHandlers() 
     For Each lbl In GroupBoxOptions.Controls.OfType(Of Label) 
      AddHandler lbl.Click, AddressOf TransferDataToEditBox 
     Next 

    End Sub 

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
     InitLabelHandlers() 

    End Sub 

End Class 

:이 예제에서, 나는 그룹 상자에 이름이 "GroupBoxOptions을"모든 레이블을 넣어.

+1

** RemoveHandlers **를 잊지 마세요. 추가하는 경우 중요합니다. – Codexer

+0

@Zaggler 레이블과 같은 관리되는 컨트롤의 경우 중요하지 않습니다. –

+1

"관리되는 컨트롤"만큼 간단하지 않습니다. 중요한 질문은 이벤트 처리기가 컨테이너보다 수명이 긴 개체에 연결되는지 여부입니다. 그렇다면 수동으로 핸들러를 제거해야합니다. 그렇지 않으면 개체 컨테이너가 파괴되면 이벤트 처리기가 자동으로 제거됩니다. 아마도 이것이 "관리되는 컨트롤"이 의미하는 바 였을 것으로 추측됩니다.하지만 명시적인 것이 좋습니다. –

-1

꽤 빠르고 멋진 솔루션은 폼의 모든 레이블 컨트롤을 트래버스하여 AddHandler 함수를 통해 사용자가 레이블을 클릭 할 때 실행할 이벤트를 할당하는 것입니다. 코드에서

다음 prevous 조각으로

For Each c As Control In Me.Controls.OfType(Of Label) 
     AddHandler c.Click, AddressOf myLabelClick 
    Next 

, 타입 라벨의 모든의 WinForm 컨트롤 위에 우리가 루프. 이와 같은 루프는 이벤트를 할당해야하는 많은 레이블이있는 경우에 유용합니다. 각각에 대해 우리는 이벤트의 Click with myLabelClick이라는 사용자 정의 된 Sub와 컨트롤을 연관시킵니다. 즉, 서브 루틴은 다음과 같이 표시됩니다

Private Sub myLabelClick(sender As Object, e As EventArgs) 
    cmdObjId.Text = DirectCast(sender, Label).Text 
End Sub 

가 여기에 우리가 Text 속성에 액세스하기 (클릭이 완료되었습니다있는 컨트롤을 나타냅니다) 발신자 변수를 사용하고 그에 따라 cmdObjId.Text을 변경합니다.

+0

그 추가 여부에 관계없이 양식에있는 모든 레이블에 대해 동일한 처리기를 추가합니다. OP가 모든 라벨에 동일한 명명 체계를 사용했다면 문제가 될 수 있습니다. –

+0

@DavidWilson : 저의 대답은 사용자가 우리에게 주신 정보를 기반으로합니다. 라벨의 이름이나 다른 필터를 사용하여 모든 라벨을 고려해야하는 것은 아니라고 지적한 경우 그에 따라 답변을 수정해야합니다. 나는 downvote를 이해하지 못했다. 그러나 어이, 그것은 지역 공동체 선택이다 – hypnos

+0

사실, 나는 downvote가 필요했다라고 생각하지 않는다. 의견이 더 좋았을 것입니다. –