我正在动态地在表单上创建一个复选框数组;创建数组的代码如下所示: -
checkbox_array(count_of_checkboxes) = New CheckBox
if (count_of_checkboxes = 0) Then
checkbox_array(count_of_checkboxes).Top = specimen_checkbox.Top
checkbox_array(count_of_checkboxes).Left = specimen_checkbox.Left
else
checkbox_array(count_of_checkboxes).Top = checkbox_array(count_of_checkboxes - 1).Top + vertical_offset
checkbox_array(count_of_checkboxes).Left = checkbox_array(count_of_checkboxes - 1).Left + horizontal_offset
End If
my_panel.Controls.Add(checkbox_array(count_of_checkboxes))
AddHandler checkbox_array(count_of_checkboxes).MouseClick, cbxSpecimen_CheckedChanged
checkbox_array(count_of_checkboxes).Name = someValue
checkbox_array(count_of_checkboxes).Text = someValue
checkbox_array(count_of_checkboxes).Enabled = true
checkbox_array(count_of_checkboxes).Visible = true
checkbox_array(count_of_checkboxes).Show()
这在一个表格上工作得很好。但是,我在从基本表单派生的表单上使用相同的代码,并遇到问题,因为在sender
参数中返回的对象,虽然显然是一个具有可识别名称的复选框,但不是' t数组中的任何复选框。
我用以下方法验证了这一点: -
Private Sub cbxSpecimen_CheckedChanged( sender As System.Object, e As System.EventArgs) Handles cbxSpecimen.CheckedChanged
For i As Integer = 0 To checkbox_array.GetUpperBound(0) - 1
If checkbox_array(i).Equals(sender) Then
// set a breakpoint here
End If
Next i
End Sub
任何人都可以解释为什么这应该适用于普通形式,而不是派生类形式?
答案 0 :(得分:1)
我用以下方法验证了这一点: -
Private Sub cbxSpecimen_CheckedChanged( sender As System.Object, e As System.EventArgs)
Handles cbxSpecimen.CheckedChanged
For i As Integer = 0 To checkbox_array.GetUpperBound(0) - 1
If checkbox_array(i).Equals(sender) Then
// set a breakpoint here
End If
Next i
End Sub
为什么checkbox_array.GetUpperBound(0) - 1
?这将跳过数组中的最后一个元素。尝试:
For i As Integer = 0 To checkbox_array.GetUpperBound(0)
If checkbox_array(i).Equals(sender) Then
// set a breakpoint here
End If
Next i
或
For i As Integer = 0 To checkbox_array.Length - 1
...
答案 1 :(得分:0)
我已经设法通过重新填充点击事件中的复选框数组来实现此目的: -
Private Sub cbxSpecimen_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles cbxSpecimen.CheckedChanged
For i As Integer = 0 To check_boxes.GetUpperBound(0)
If check_box_array(i).Name = CType(sender, CheckBox).Name And
Not check_box_array(i).Equals(sender) Then
check_box_array(i) = CType(sender, CheckBox)
End If
Next i
' do useful work
End Sub
在表单上的复选框被填充回数组后,它仍然存在(因此第二次调用相同的复选框不会再次插入到数组中)。
这对我来说似乎是一个可怕的黑客攻击,但我会暂时继续使用它。