如何在VB.NET中为动态控件数组创建事件

时间:2010-11-16 21:49:41

标签: vb.net events

我正在尝试动态创建一个复选框数组,并且还希望将事件放入这些复选框。我怎么能这样做?

例如:

我有一系列复选框 - Chk1,Chk2。

我希望它以这种方式工作:当我检查Chk1时,我想禁用Chk2,当未选中Chk1时,Chk2启用,反之亦然。

非常感谢您的意见。

谢谢,

P.S。:代码在VB.NET中。感谢。


谢谢大家的投入。我真的很感激。也许我之前对我的解释不太清楚。

比方说,我有一个包含6个复选框的数组,我希望它们像这样在组中运行:

  • 当选中Chk1时,Chk2被禁用(灰显),当我们取消选中Chk1时,Chk2被启用,而且反之亦然。

  • 当选中Chk3时,Chk4被禁用,当我们取消选中Chk3时,Chk4被启用,而且反之亦然。

依旧......

因此,这就像数组中的每对复选框一样,彼此执行CheckChanged事件,但不会在任何其他对上执行。所以我认为OptionButton在这种情况下并非如此。

感谢您的任何建议。

2 个答案:

答案 0 :(得分:0)

假设它是ASP.Net,看看这个“奇怪”的例子,看它是如何工作的(拿你的数组代替我的静态创建):

Private Sub WebForm1_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
    For number As Int32 = 1 To 100
        Dim chk As New CheckBox
        chk.ID = "chk" & number
        chk.Text = chk.ID
        chk.AutoPostBack = True
        AddHandler chk.CheckedChanged, AddressOf onCheckedChanged
        Me.MyChkPanel.Controls.Add(chk)
    Next
End Sub

Private Sub onCheckedChanged(ByVal sender As Object, ByVal e As EventArgs)
    Dim chk As CheckBox = DirectCast(sender, CheckBox)
    Dim number As Int32 = Int32.Parse(chk.ID.Substring("chk".Length))
    Dim otherChk As CheckBox
    If number Mod 2 = 0 Then
        otherChk = DirectCast(Me.MyChkPanel.FindControl("chk" & (number - 1)), CheckBox)
    Else
        otherChk = DirectCast(Me.MyChkPanel.FindControl("chk" & (number + 1)), CheckBox)
    End If
    otherChk.Enabled = Not chk.Checked
End Sub

除此之外,我可以订阅Hans的建议,使用RadioButtons或至少CheckBoxList

答案 1 :(得分:0)

RadioButton会自动执行此操作并且更常规。对于一系列复选框,您可以对整个数组使用单个处理程序:

Private Sub _CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
Dim i As Integer
If sender.checked Then
  For i = 0 To UBound(chk)
    If chk(i) IsNot sender Then chk(i).Checked = False
  Next i
End If
End Sub

请记住,如果对此处理程序进行了更改,则在将chk(i).checked设置为false时会以递归方式调用它。在这种情况下无关紧要,因为当sender.checked为false时,它会跳过所有内容。

如果您需要它,这是设置数组的一种方法。 (设计器中的索引属性在从vb6到.net的升级中消失了,所以你现在必须在代码中创建一个控件数组。)

Public Class Form1
Dim chk(4) As CheckBox

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim i, k As Integer
k = 20
For i = 0 To UBound(chk)
  chk(i) = New CheckBox
  Me.Controls.Add(chk(i))
  chk(i).Location = New Point(20, k)
  k = k + chk(0).Height * 1.5 ' or some location
  chk(i).Text = "Checkbox " & i ' some appropriate text
  AddHandler chk(i).CheckedChanged, AddressOf _CheckedChanged
Next i

End Sub