【问题标题】:How to add event handler to a dynamically created control in VB.NET?如何将事件处理程序添加到 VB.NET 中动态创建的控件?
【发布时间】:2012-11-29 05:17:27
【问题描述】:

我在这个论坛和其他网站上搜索并看到了无数示例,但我仍然遇到这个问题; 我想为动态创建的 PictureBox-es 添加一个 Click Handler 并在其上传递一个参数,以便我知道点击了哪个图片框。

这是我当前的代码:

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”来识别单击了哪个图片框。

有人可以指出我正确的方向或提供一些建议吗?非常感谢。

【问题讨论】:

  • 你已经得到了标识图片框的参数,它是sender参数。
  • 我最近经常看到这个“发件人”的东西,但我不知道如何在我的情况下使用它。 'code' Public Sub testini(ByVal sender, ByVal EventArgs) '这里怎么用?结束子
  • sender 是被点击的PictureBox。在您的testini 方法中,您可以说Dim pbox As PictureBox = DirectCast(sender, PictureBox),然后使用用户单击的图片框执行操作(更改图片等)。

标签: vb.net visual-studio-2008 event-handling


【解决方案1】:

您需要向您创建的 PictureBox 添加一些内容以在事件处理程序中识别它们,因为您无法更改单击事件处理程序的签名添加“参数”

例如,您可以设置 Name 属性

pp(i) = New GroupBox
pp(i).Name = "PictureBox" + i.ToString

然后在事件处理程序中,您可以识别您的图片框,将发送者对象转换为图片框并获取 Name 属性。
请记住,sender 始终是触发事件的控件。在您的情况下,始终是您动态创建的图片框之一

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

【讨论】:

  • 我认为.Tag 需要设置为pp(i),而不是gr(i)
  • 重写为使用更自然的 Name 属性。
  • 感谢十亿史蒂夫,这解决了问题。你是冠军:)
猜你喜欢
  • 1970-01-01
  • 2018-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-01
  • 2011-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多