我正面对一个deadend当试图打电话给这个子时:
Public Sub backblue(ByVal frm As Form, ByVal boxname As String)
For i = 1 To 3
CType(frm.Controls(boxname & i.ToString()), TextBox).BackColor = Color.LightBlue
Next
End Sub
按钮点击事件:
Private Sub Button1_click and bla bla....
backblue(Me, "txb1_")
End Sub
有人可以告诉我修改代码的建议。
它抛出“对象引用未设置为实例bla bla”错误
有关信息,文本框名称为: txb1_1,txb1_2,txb1_3 (这些是我想要改变bakcolor的形式中的一些文本框)
这三个文本框已经通过设计师创建,而不是从执行中创建。
我确实检查了文本框名称,没有任何错误。
表单类也是公开的。
答案 0 :(得分:2)
如果它们是所述表单上唯一的文本框,您可以循环浏览
For Each box as Textbox In frm.Controls
box.BackColor = Color.LightBlue
Next
答案 1 :(得分:2)
答案 2 :(得分:1)
这个循环生成的名称可能看起来可能不是原始文本框的名称。我的建议是在设置此Color属性之前验证此循环生成的名称确实是实际名称。也许在消息框中输出:
在设置属性
MessageBox.Show(boxname & i.ToString())
答案 3 :(得分:1)
试试这个......
Public Sub backblue(ByVal frm As Form, ByVal prefix As String)
For i = 1 To 3
Dim bxName as String = prefix & i.ToString()
Dim bx as TextBox = CType(frm.Controls(bxName), TextBox)
If bx Is Nothing Then
MsgBox("Unable to find text box " +bxName)
Dim mtch() As Control = frm.Controls.Find(bxName, true)
If mtch.Length> 0 then
bx = mtch(0)
Else
Continue For
End if
End If
Bx.BackColor = Color.LightBlue
Next
End Sub
尽管如此,更好的解决方案是在控件内创建文本框并将该控件传递给BackBlue,或者创建一个具有控件并将其传入的集合。这会带来最可能出现问题的问题您的控件包含在子组件中,因此不在主窗体控件集合中
或者,您可以使用控件的标记或创建实现IExtenderProvider的组件控件并将其添加到表单中 - 以上所有内容都可以有效地允许您定义控件和/或如何处理它们设计时。