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

VB.NET通过类似命名的表单控件循环,vb.net,vb6-migration,Vb.net,Vb6 Migration,好吧,我给你的大脑弄了个挠痒的东西。我正在将一个用VB6编写的程序转换为Visual Studio 2010 VB.Net,但遇到了一个问题。我试图在一个表单上循环使用20个表单元素,这些表单元素都有前缀“chkCustomerItems”,然后后面有一个数字1到20。我将其用于数据库查找,这样就有了一个数据库条目,然后将数据库项名称应用于复选框的文本字段并打开可见性。以下是我编写的代码: ConnOpenClose() 当它运行时,我得到一个NullReferenceException错误。这

好吧,我给你的大脑弄了个挠痒的东西。我正在将一个用VB6编写的程序转换为Visual Studio 2010 VB.Net,但遇到了一个问题。我试图在一个表单上循环使用20个表单元素,这些表单元素都有前缀“chkCustomerItems”,然后后面有一个数字1到20。我将其用于数据库查找,这样就有了一个数据库条目,然后将数据库项名称应用于复选框的文本字段并打开可见性。以下是我编写的代码: ConnOpenClose()

当它运行时,我得到一个NullReferenceException错误。这基本上就是我在VB6中使用的代码(对.NET基础结构做了一些更改)。请帮我找出我做错了什么,目前我不得不硬编码所有20项,虽然它工作,但它看起来也不漂亮


提前感谢您

您正在使用Text属性,因此我假设这是textbox
试试这个:

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

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

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

Do
tempString=“chkCustomerItems”&tempInteger.ToString
将控件设置为控件()
aoControls=Me.Controls.Find(tempString,True)
如果aoControls不是Nothing,也不是aoControls.Length 0,那么
将oTextBox设置为文本框
oTextBox=TryCast(aoControls(0),文本框)
如果oTextBox不是空的,那么
oTextBox.Text=Rs.Fields(“项”).Value
oTextBox.Visible=True
如果结束
如果结束
tempInteger=tempInteger+1
R.MoveNext()
如果tempInteger=21,则
退出Do
如果结束
循环至Rs.EOF

我将此代码完全按照您键入的方式放置到位,但是在oTextBox=TryCast(aoControls,TextBox)行中,我收到了错误消息“无法在aoControls上将“System.Windows.Form.Control的一维数组”类型的值转换为“Ssytem.Windows.Forms.Textbox”。-知道为什么吗?哦,很抱歉。它应该是
aoControls(0)
。我已经更新了答案。哇,这正是我想要的!!非常感谢你。我知道在.NET中有一个代码可以做我想做的事情。
DirectCast(Controls(tempString), TextBox).Text = Rs.Fields("Item").Value
 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