0

我正在动态地在表单上创建一组复选框;创建数组的代码如下所示:-

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参数中返回的对象,虽然显然是一个具有可识别名称的复选框,但不是任何复选框在数组中。

我通过以下方式验证了这一点:-

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

任何人都可以解释为什么这应该在正常形式上工作,而不是派生类形式?

4

2 回答 2

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
    ...
于 2013-05-22T16:23:05.987 回答
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

在表单上的复选框被塞回数组后,它仍然存在(因此对同一复选框的第二次调用不会再次插入数组)。

这对我来说似乎是一个可怕的黑客攻击,但我会暂时接受它。

于 2013-05-23T07:40:30.693 回答