Asp.net 从表单抓取dropdownlist时出现奇怪的转换错误

Asp.net 从表单抓取dropdownlist时出现奇怪的转换错误,asp.net,.net,vb.net,Asp.net,.net,Vb.net,我有一个.net web表单,后端在vb.net中。一些下拉列表被添加到表单中,它们的控件遵循命名约定“ddlCol”+整数,因此“ddlCol0”、“ddlCol1”等 当我尝试获取这些下拉列表中的一个来针对控件进行编码时,我得到了一个从字符串到整数的转换错误:从字符串“ddlCol0”到类型“integer”的转换无效 以下是我正在使用的代码: sDDL = "ddlCol" + iDDLControlCounter.ToString() Dim ddl As DropDownLi

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

当我尝试获取这些下拉列表中的一个来针对控件进行编码时,我得到了一个从字符串到整数的转换错误:从字符串“ddlCol0”到类型“integer”的转换无效

以下是我正在使用的代码:

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

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

如果你想在VB.NET中处理字符串(与C#类似),你必须使用
&

但是,这不应导致转换错误。可能
sDDL
被声明为
Int32

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

见:

编辑:是具有索引器的集合。因此,您可以通过
Me.Controls(0)
获取第一个控件。这就是异常的主要原因,因为
sDDL
是一个
字符串。但这些知识无助于进一步查找您的
DropDownLists

所以请阅读更多

这些下拉列表位于 gridview有什么不同?我当时的心态是,控制是一个过程 控制是一种控制,但也许有些规则我不知道 用这个

不,那没什么区别。然后,当您尝试使用
DropDownList
时,将得到一个
NullReferenceException

但是您需要使用
Control.FindControl
通过控件的ID获取控件的引用

如果它确实位于
网格视图的标题行中
,则必须在正确的
标题行上使用
FindControl

If grid.HeaderRow IsNot Nothing Then
    Dim ddl = DirectCast(grid.HeaderRow.FindControl("ddlCol" & iDDLControlCounter), DropDownList)
End If

如果要在VB.NET中处理字符串(与C#类似),必须使用
&

但是,这不应导致转换错误。可能
sDDL
被声明为
Int32

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

见:

编辑:是具有索引器的集合。因此,您可以通过
Me.Controls(0)
获取第一个控件。这就是异常的主要原因,因为
sDDL
是一个
字符串。但这些知识无助于进一步查找您的
DropDownLists

所以请阅读更多

这些下拉列表位于 gridview有什么不同?我当时的心态是,控制是一个过程 控制是一种控制,但也许有些规则我不知道 用这个

不,那没什么区别。然后,当您尝试使用
DropDownList
时,将得到一个
NullReferenceException

但是您需要使用
Control.FindControl
通过控件的ID获取控件的引用

如果它确实位于
网格视图的标题行中
,则必须在正确的
标题行上使用
FindControl

If grid.HeaderRow IsNot Nothing Then
    Dim ddl = DirectCast(grid.HeaderRow.FindControl("ddlCol" & iDDLControlCounter), DropDownList)
End If

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

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

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

请注意,如果您知道确切的类型,DirectCast比CType快一点。

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

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

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

请注意,如果您知道确切的类型,DirectCast比CType快一点。

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

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

不,它是一根线。。。Dim sDDL As StringAnd您是对的,它没有修复转换。这些下拉列表位于gridview的标题行中这一事实会有所不同吗?我的心态是控件就是控件就是控件,但也许有一些规则我不知道?我在页面上打开了Option Strict,在Dim ddl行中显示为DropDownList=CType(Me.Controls(sDDL),DropDownList),它试图让我先将sDDL转换为整数。。。我试图按名称查找控件,sDDL肯定是一个字符串。我是否错误地使用了Me.Controls()?@optionsix Tim提出了一些好的观点,但问题实际上是控件使用了一个数字;您需要FindControl,请参阅我的单独答案。@optionsix:编辑了我的答案。不,是字符串。。。Dim sDDL As StringAnd您是对的,它没有修复转换。这些下拉列表位于gridview的标题行中这一事实会有所不同吗?我的心态是控件就是控件就是控件,但也许有一些规则我不知道?我在页面上打开了Option Strict,在Dim ddl行中显示为DropDownList=CType(Me.Controls(sDDL),DropDownList),它试图让我先将sDDL转换为整数。。。我试图按名称查找控件,sDDL肯定是一个字符串。我是否错误地使用了Me.Controls()?@optionsix Tim提出了一些好的观点,但问题实际上是控件使用了一个数字;您需要FindControl,请参阅我的单独答案。@optionsix:已编辑我的答案。