【问题标题】:Dynamically AddHandler动态添加处理程序
【发布时间】:2023-03-30 00:15:01
【问题描述】:

我在一个表单上有大量按钮(144 个按钮)。每个按钮的名称是不同因素的组合。

我需要他们在按下时都做同样的事情。我在名为“ClickButton”的 Private Sub 下有此事件。

我想用一个循环,把每个按钮的AddHandler添加到“ClickButton”事件中。

然而,首先,我需要处理每个按钮。我通过在循环中动态构造它们的名称来做到这一点。

Dim PeriodRoomID As New Button
Dim cntrl() As Control    

For Each Row In dsAllRooms.Tables("sqlAllRooms").Rows
            For Count = 1 To 13
                RoomID = Row.Item(0)
'This is where the name of each room is dynamically created. 
'It is stored in PeriodRoomID.name
                PeriodRoomID.Name = "R02" & RoomID.PadLeft(3, "0"c) & Count
                cntrl = Me.Controls.Find(PeriodRoomID.Name, True)
                AddHandler cntrl(0).Click, AddressOf ClickButton
            Next
        Next

问题是什么都没有发生。 AddHandler 不起作用。但是,如果我只写其中一个按钮的名称;

AddHandler R020011, AddressOf ClickButton

然后它确实有效。 Me.Controls.Find 出了点问题。它似乎无法找到该名称下的任何按钮,这很奇怪,因为我在其他部分使用相同的代码并且它找到了按钮。

【问题讨论】:

  • 此例程在页面生命周期的哪个时间点运行?您在什么时候创建按钮?
  • 是否还有其他相同形式的按钮?换句话说,为表单上的所有按钮设置处理程序是否适合您?
  • @jfmags 按钮不是动态创建的,是用表单创建的。
  • @svick 不幸的是还有其他按钮:(
  • 当 PeriodicRoomID 仅用作传递给 find() 函数的字符串 var 时,为什么它是一个按钮实例?您的表单创建的按钮是否已经命名,或者您是否尝试在该循环中实现这一点?

标签: .net vb.net winforms addhandler


【解决方案1】:

您在for 语句中定义Dim PeriodRoomID As New Button,因此每次设置名称时 您将其设置为相同的按钮PeriodRoomID,因此您不需要此按钮,cntrl 也不需要:

For Each Row In dsAllRooms.Tables("sqlAllRooms").Rows
            For Count = 1 To 13
                RoomID = Row.Item(0)
                'This is where the name of each room is dynamically created.   
                dim Ctrls = Me.Controls.Find("R02" & RoomID.PadLeft(3, "0"c) & CStr(Count), True)
                If (Ctrls.Count > 0) Then
                   AddHandler Ctrls(0).Click, AddressOf ClickButton
                End If
            Next
Next

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-05
    • 2010-12-04
    • 2014-07-06
    • 2020-03-06
    • 2016-06-06
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多