我有一个子程序,当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
但我收到错误:对象引用未设置为对象的实例。
我该怎么办?
答案 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)