从表单中获取下拉列表时出现奇怪的转换错误

时间:2013-07-03 14:34:20

标签: asp.net .net vb.net

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

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

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

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

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

3 个答案:

答案 0 :(得分:4)

如果你想在VB.NET中连接字符串(因为选择C#),你必须使用&

sDDL = "ddlCol" & iDDLControlCounter.ToString()

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

无论如何,您应该将OPTION STRICT设置为On,因为我怀疑该错误是由隐式转换引起的。如果可能的话,应该避免延迟绑定。

请参阅:Option Strict Statement

修改Controls.Controls是一个拥有索引器的集合。因此,您可以通过Me.Controls(0)获得第一个控件。因此,这是异常的主要原因,因为sDDLString。但是这个知识无助于进一步找到你的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()只接受整数作为争论,而不是字符串。