在事件处理程序中返回的复选框不是表单上的复选框

时间:2013-05-22 15:22:40

标签: vb.net winforms inheritance

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

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

任何人都可以解释为什么这应该适用于普通形式,而不是派生类形式?

2 个答案:

答案 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

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

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