我有一个.net网络表单,后端在vb.net中。一些下拉列表被添加到表单中,其控件遵循命名约定“ddlCol”+整数,因此“ddlCol0”,“ddlCol1”等等。
当我尝试抓取其中一个下拉列表来对照控件进行编码时,我收到从字符串到整数的转换错误:从字符串“ddlCol0”到“Integer”类型的转换无效。
以下是我正在使用的代码:
sDDL = "ddlCol" + iDDLControlCounter.ToString()
Dim ddl As DropDownList = CType(Me.Controls(sDDL), DropDownList)
我承认我的vb.net有点生疏。有什么蠢话我做错了吗?
答案 0 :(得分:4)
如果你想在VB.NET中连接字符串(因为选择C#),你必须使用&
:
sDDL = "ddlCol" & iDDLControlCounter.ToString()
但是,这不应导致转换错误。也许sDDL
被声明为Int32
。
无论如何,您应该将OPTION STRICT
设置为On
,因为我怀疑该错误是由隐式转换引起的。如果可能的话,应该避免延迟绑定。
修改:Controls.Controls
是一个拥有索引器的集合。因此,您可以通过Me.Controls(0)
获得第一个控件。因此,这是异常的主要原因,因为sDDL
是String
。但是这个知识无助于进一步找到你的DropDownLists
。
所以阅读更多......
这些下拉列表是否在a的标题行中 gridview有所作为?我有一种控制是一种心态 控制是一种控制,但也许有一些我不知道的规则 这个?
不,这没有什么区别。然后,当您尝试使用NullReferenceException
时,您将获得DropDownList
。
但您需要使用Control.FindControl
通过ID获取控件的引用。
如果它真的位于GridView
的标题行中,则必须使用FindControl
HeaderRow
If grid.HeaderRow IsNot Nothing Then
Dim ddl = DirectCast(grid.HeaderRow.FindControl("ddlCol" & iDDLControlCounter), DropDownList)
End If
上的{{1}}:
{{1}}
答案 1 :(得分:0)
问题不在于字符串连接,而在于您对Controls集合如何工作的假设;它只需要一个数值。
相反,我相信您需要使用的方法是FindControl:
sDDL = "ddlCol" & iDDLControlCounter.ToString()
Dim ddl As DropDownList = CType(Me.FindControl(sDDL), DropDownList)
请注意,如果您知道精确类型,则DirectCast(快速)比CType快。
答案 2 :(得分:0)
OP中的实际错误是Me.Controls()
只接受整数作为争论,而不是字符串。