好的,我的脑子里有一个痒痒的人。我正在将我在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个项目进行硬编码,虽然它有效,但看起来并不漂亮。
提前谢谢
答案 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