在VB.NET中更改未知对象的属性

时间:2009-07-25 11:19:31

标签: vb.net events properties casting object

我有一个子程序,当14个ComboBox改变其索引时处理它。我能够投射事件的发件人,并从那里获得属性。但是,之后,我希望能够更改实际发件人的属性,而不是强制转发器的属性。我该怎么做?

当前代码:

Private Sub ComboBoxIndexChange(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged, ComboBox2.SelectedIndexChanged [etc]
        Dim myComboBox As ComboBox = sender

        Select Case myComboBox.Text
            Case "Will"
                Me.Controls(myComboBox.Name).Text = "555-555-555"
            Case "Bob"
                Me.Controls(myComboBox.Name).Text = "555-124-1234"
            [etc]
        End Select
    End Sub
End Class

如您所见,我目前正在尝试使用

Me.Controls(myComboBox.Name).Text

但我收到错误:对象引用未设置为对象的实例。

我该怎么办?

5 个答案:

答案 0 :(得分:2)

事件处理程序中的sender参数将(通常)包含对引发事件的对象的引用。对于SelectedIndexChanged控件的ComboBox事件,ComboBox属性的SelectedIndex属性已更改。因此,在上面的代码示例myComboBox中,引用了引发事件的ComboBox

澄清一下:如果您在ComboBox控件的下拉列表中选择一个项目,以便它引发SelectedIndexChanged事件,则事件处理程序的sender参数将为相同的ComboBox ,而不是它的副本。这适用于所有参考类型。

如果它是一种提升事件的价值类型,那将是一个完全不同的故事,但这是一种非常罕见的情况(在表格上的控制方面绝不是这种情况)。

答案 1 :(得分:1)

ComboBox是一种引用类型,因此如果直接指定myComboBox变量的Text属性,它将更新控件。

答案 2 :(得分:0)

这应该有效:

 Dim ctl As Control
 Dim cmb As ComboBox

 For Each ctl In Me.Controls
   If sender Is ctl Then
     cmb = ctl
     cmb.Text = "string"
     End If
   Next ctl

您可以添加特定的字符串分配代码来代替cmd.Text =“string”。分配cmb允许您使用特定的组合框属性而不是通用控件属性。

答案 3 :(得分:0)

要回答原因为何您获得空对象引用异常的问题,您正在搜索表单的直接子控件?它是否位于表格中的面板或其他容器中?如果是这样,那么我认为您不会在Form的Controls集合中找到该控件。所以这一行:

Me.Controls(myComboBox.Name).Text

仅搜索表单直接子项,而不是递归遍历这些控件的子项。

答案 4 :(得分:0)

如果我使用以下代码,我将得到相同的错误:对象引用未设置为对象的实例。

Me.Controls(TBName).DataBindings.Add("Text", dt, dt.Columns(colindex).ColumnName)

Christian Pena的消化适合我的情况,所以正确的代码应该是:

Me.TCAll.TabPages(0).Controls(TBName).DataBindings.Add("Text", dt, dt.Columns(colindex).ColumnName)