Asp.net 从表单抓取dropdownlist时出现奇怪的转换错误
我有一个.net web表单,后端在vb.net中。一些下拉列表被添加到表单中,它们的控件遵循命名约定“ddlCol”+整数,因此“ddlCol0”、“ddlCol1”等 当我尝试获取这些下拉列表中的一个来针对控件进行编码时,我得到了一个从字符串到整数的转换错误:从字符串“ddlCol0”到类型“integer”的转换无效 以下是我正在使用的代码: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
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:已编辑我的答案。