调用公共子时的问题

时间:2014-04-08 00:27:46

标签: vb.net

我正面对一个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的形式中的一些文本框)

这三个文本框已经通过设计师创建,而不是从执行中创建。

我确实检查了文本框名称,没有任何错误。

表单类也是公开的。

4 个答案:

答案 0 :(得分:2)

如果它们是所述表单上唯一的文本框,您可以循环浏览

For Each box as Textbox In frm.Controls
box.BackColor = Color.LightBlue
Next

答案 1 :(得分:2)

  1. 如果您未声明Form类是公开的,则会发生此错误。
  2. 此外,请确保文本框名称确实正确,但这可能会导致不同的错误。
  3. 如果在执行期间创建文本框,请确保使用“新建”初始化文本框并将其添加到表单的“控件”集合中。

答案 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的组件控件并将其添加到表单中 - 以上所有内容都可以有效地允许您定义控件和/或如何处理它们设计时。