0

我有一个 .net 网络表单,后端在 vb.net 中。一些下拉列表被添加到表单中,它们的控件遵循命名约定“ddlCol”+整数,例如“ddlCol0”、“ddlCol1”等。

当我尝试抓取其中一个下拉列表以针对控件进行编码时,我收到从字符串到整数的转换错误:从字符串“ddlCol0”到类型“整数”的转换无效。

这是我正在使用的代码:

 sDDL = "ddlCol" + iDDLControlCounter.ToString()
    Dim ddl As DropDownList = CType(Me.Controls(sDDL), DropDownList)

我承认我的 vb.net 有点生疏。有什么愚蠢的我做错了吗?

4

3 回答 3

4

&如果要在 VB.NET 中连接字符串(与 C# 相对),则必须使用:

sDDL = "ddlCol" & iDDLControlCounter.ToString()

但是,这不应该导致您的转换错误。也许sDDL被声明为Int32.

无论如何,您应该设置OPTION STRICT为,On因为我怀疑该错误是由隐式转换引起的。如果可能,应避免后期装订。

请参阅:期权严格声明

编辑Controls.Controls是一个具有索引器的集合。所以你可以通过Me.Controls(0). 所以这是异常的主要原因,因为sDDLString. 但是这些知识并不能帮助您进一步找到您的DropDownLists.

所以阅读更多...

这些下拉列表位于gridview的标题行中的事实会有所不同吗?我的心态是控制就是控制就是控制,但也许有一些我不知道的规则?

不,这没有什么区别。然后,NullReferenceException当您尝试使用您的DropDownList.

但是您需要使用Control.FindControl它的 ID 来获取控件的引用。

如果它确实在 a 的标题行中,GridView则必须使用FindControl正确NamingContainer的,即HeaderRow

If grid.HeaderRow IsNot Nothing Then
    Dim ddl = DirectCast(grid.HeaderRow.FindControl("ddlCol" & iDDLControlCounter), DropDownList)
End If
于 2013-07-03T14:35:32.457 回答
0

问题不在于您的字符串连接,而在于您对 Controls 集合如何工作的假设;它只需要一个数值。

相反,我相信您需要使用的方法是 FindControl:

sDDL = "ddlCol" & iDDLControlCounter.ToString()
Dim ddl As DropDownList = CType(Me.FindControl(sDDL), DropDownList)

请注意,如果您知道精确的类型,DirectCast (部分)比 CType 快。

于 2013-07-03T14:45:44.290 回答
0

OP 中的实际错误是Me.Controls()仅将整数作为参数,而不是字符串。

于 2013-07-03T14:51:45.030 回答