2012-11-28 3 views
1

이 포럼과 다른 사이트에서 수 많은 샘플을 검색하여 보았습니다. 그러나 여전히이 문제에 봉착했습니다. 동적으로 생성 된 PictureBox-es에 클릭 핸들러를 추가하고 그림 상자 중 어느 것을 클릭했는지 알 수 있도록 인수를 전달하려고합니다. 여기 VB.NET에서 동적으로 생성 된 컨트롤에 이벤트 처리기를 추가하는 방법은 무엇입니까?

내 현재 코드입니다 :

그래서
Public Class frmMbarimAbonimi 

Private Sub frmMbarimAbonimi_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    'TODO: This line of code loads data into the 'FitnessdbDataSet.clients' table. You can move, or remove it, as needed. 
    'Me.ClientsTableAdapter.Fill(Me.FitnessdbDataSet.clients) 

    '=============== 
    Dim dt As DataTable = PaPaguar() 
    Dim i As Integer = 0 

    Dim gr(dt.Rows.Count) As GroupBox 
    Dim pp(dt.Rows.Count) As PictureBox 
    Dim lb(dt.Rows.Count) As Label 


    For Each row As DataRow In dt.Rows 

     gr(i) = New GroupBox 
     gr(i).Width = 200 
     gr(i).Height = 180 

     pp(i) = New PictureBox 
     pp(i).SizeMode = PictureBoxSizeMode.StretchImage 

     lb(i) = New Label 



     '------------------------- 
     Try 
      Using str As Stream = File.OpenRead("C:\Fotot\" + dt.Rows(i).Item("Foto")) 
       pp(i).Image = Image.FromStream(str) 
      End Using 

      lb(i).Text = dt.Rows(i).Item("Emer") 

     Catch ex As Exception 

      MsgBox("Fotoja nuk mund te ngarkohet, ju lutem realizoheni nje foto tjeter!!!") 

     End Try 
     '------------------------- 
     pp(i).Visible = True 
     pp(i).Width = 200 
     pp(i).Height = 150 

     AddHandler pp(i).Click, AddressOf testini 



     gr(i).Controls.Add(pp(i)) 

     lb(i).Visible = True 
     lb(i).Width = 200 
     lb(i).Height = 30 
     lb(i).Left = pp(i).Left 
     lb(i).Top = pp(i).Top + 150 
     lb(i).BackColor = Color.WhiteSmoke 
     lb(i).BringToFront() 
     gr(i).Controls.Add(lb(i)) 

     flpanel.Controls.Add(gr(i)) 

     i = i + 1 
    Next row 
End Sub 
End Class 

내가 AddHandler에 PP (I) .Click, AddressOf를 testini를 ​​사용하려고했지만 분명이 저를 식별하는 매개 변수를 "testini"호출 할 수 없습니다 어느 그림 상자를 클릭 했습니까?

누군가 올바른 방향으로 나를 가르키거나 조언을 해줄 수 있습니까? 대단히 감사합니다.

+0

당신은 이미 * sender * 인수입니다 그림 상자를 식별하는 매개 변수가 있습니다. –

+0

나는이 "보낸 사람"을 최근에 매우 자주 보았지만 나는 나의 경우에 그것을 어떻게 사용할 수 있는지 알지 못한다. '코드' 공개 서브 testini (ByVal 보낸 사람, ByVal EventArgs) '여기에서 사용하는 방법? End Sub –

+0

'sender'는 클릭 된'PictureBox'입니다. 'testini' 메쏘드에서,'Dim pbox As PictureBox = DirectCast (보낸 사람, PictureBox)'라고 말할 수 있으며, 사용자가 클릭 한 그림 상자로 사물을 변경합니다. – prprcupofcoffee

답변

3

당신은 당신이 '매개 변수'예를 들어

를 추가 클릭 이벤트 처리기의 서명을 변경할 수 없기 때문에 이벤트 처리기에서 그들을 식별하기 위해 생성의 PictureBox에 무언가를 추가 할 필요가, 당신은 이름을 설정할 수 있습니다 속성

다음 이벤트 처리기에서 보낸 사람 개체를 그림 상자로 캐스팅하고 Name 속성을 잡는 그림 상자를 인식 할 수 있습니다.
보낸 사람은 항상 이벤트를 트리거하는 컨트롤입니다. 귀하의 경우에는 항상 귀하의 dinamically 만든 PictureBoxes 중 하나입니다

Private Sub testini(sender As Object, e As System.EventArgs) 
    Dim pb As PictureBox = DirectCast(sender, PictureBox) 
    Dim pbIdentity As String = pb.Name 
    ..... 
End Sub 
+1

'.Tag'는'gr (i)'가 아니라'pp (i)'에 설정되어야한다고 생각합니다. – prprcupofcoffee

+0

@David, 감사합니다, 복사/붙여 넣기가 실패합니다 :-) – Steve

+2

더 자연적인 Name 속성을 사용하도록 다시 작성되었습니다. – Steve

관련 문제