VB.NET循环通过类似命名的表单控件

时间:2012-01-02 06:06:36

标签: vb.net vb6-migration

好的,我的脑子里有一个痒痒的人。我正在将我在VB6中编写的程序转换为Visual Studio 2010 VB.Net并遇到了问题。我试图在所有前缀为“chkCustomerItems”的表单上循环显示20个表单元素,然后在它们后面加上1到20的数字。我正在使用它与数据库查找,以便它有一个数据库条目,然后它将数据库项目名称应用于复选框的文本字段并打开可见性。这是我写的代码:     ConnOpenClose()

Rs = New ADODB.Recordset
Sql = "SELECT * FROM CustomersItems;"
Rs.Open(Sql, Conn)

If Rs.EOF = False Then
    tempInteger = 1
    Rs.MoveFirst()
    Do
        tempString = "chkCustomerItems" & tempInteger.ToString
        Me.Controls(tempString).Text = Rs.Fields("Item").Value
        Me.Controls(tempString).Visible = True
        tempInteger = tempInteger + 1
        Rs.MoveNext()
        If tempInteger = 21 Then GoTo ExitLoop
    Loop Until Rs.EOF
ExitLoop:
End If

运行时,我收到NullReferenceException错误。这基本上是我在VB6中使用的代码(对.NET基础结构进行了一些更改)。请帮助我弄清楚我做错了什么,暂时我不得不对所有20个项目进行硬编码,虽然它有效,但看起来并不漂亮。

提前谢谢

2 个答案:

答案 0 :(得分:0)

您正在使用文字属性,因此我假设这是文本框。
试试这个:

DirectCast(Controls(tempString), TextBox).Text = Rs.Fields("Item").Value

答案 1 :(得分:0)

如果您的任何控件嵌入任何容器控件(面板,选项卡等)中,您将无法通过Controls集合索引获取它们。

相反,您需要将Controls.Find与第二个参数(searchAllChildren)设置为true(我还添加了一些额外的检查和.Net方式):

 Do
    tempString = "chkCustomerItems" & tempInteger.ToString

    Dim aoControls As Control()
    aoControls = Me.Controls.Find(tempString, True)
    If aoControls IsNot Nothing AndAlso aoControls.Length <> 0 Then
       Dim oTextBox As TextBox

       oTextBox = TryCast(aoControls(0), TextBox)
       If oTextBox IsNot Nothing Then
          oTextBox.Text = Rs.Fields("Item").Value
          oTextBox.Visible = True
       End If
    End If

    tempInteger = tempInteger + 1
    Rs.MoveNext()
    If tempInteger = 21 Then 
       Exit Do
    End If
Loop Until Rs.EOF