动态设置控件ID

时间:2009-10-14 03:19:03

标签: asp.net

我有几个texboxt和dropdownlist,他们的id就像“txtName1,txtName2,txtName3 ......”和“ddlAction1,ddlAction2,ddlAction3 ......”!我想动态设置textboxt和dropdownlist id为:

for i as integer = 0 to 6
   a = txtName+i.text
   b = ddlAction+i.SelectedValue
next i

需要你们的帮助才能做到这一点!感谢....

3 个答案:

答案 0 :(得分:3)

密钥是FindControl,它按预期的ID查找控件:

For i As Integer = 0 To 5
    Dim txt As TextBox = TryCast(Me.Page.FindControl("txtName" & i.ToString()), TextBox)
    Dim ddl As DropDownList = TryCast(Me.Page.FindControl("ddlAction" & i.ToString()), DropDownList)

    If txt IsNot Nothing AndAlso ddl IsNot Nothing Then
        Dim a As String = txt.Text
        Dim b As String = ddl.SelectedValue
    End If
Next

如果找不到具有该ID的控件,它将返回null / nothing。

请注意,FindControl只会搜索给定控件(或页面)immediate children,而不是整个控制树。要递归搜索,您需要使用自己的FindControl方法。

Private Function FindControlRecursive(ByVal control As Control, ByVal id As String) As Control
    Dim returnControl As Control = control.FindControl(id)
    If returnControl Is Nothing Then
        For Each child As Control In control.Controls
            returnControl = child.FindControlRecursive(id)
            If returnControl IsNot Nothing AndAlso returnControl.ID = id Then
                Return returnControl
            End If
        Next
    End If
    Return returnControl
End Function

答案 1 :(得分:3)

.Net要求您在编译时解析变量名,而不是像代码尝试那样运行时。这是的事情,因为它可以防止您制作某些类型的错误。但这确实意味着您需要针对此特定问题寻找替代方法。

一个选项是基于FindControl的方法。但是,您关注的控件可能会在页面上组合在一起。如果它们尚未存在,请将它们放在一个通用的容器控件中,如面板。然后你可以做这样的事情(需要System.Linq):

For Each t As TextBox In MyContainer.Controls.OfType(Of TextBox)()
    a = t.Text
Next t

For Each d As DropDownList In MyContainer.Controls.OfType(Of DropDownList)()
    b = d.SelectedValue
Next d

另外,我希望你在循环中做一些其他的事情。否则,大多数工作都是无用的,因为您将退出循环,只需将上次迭代的值分配给您的变量。

最后,似乎这些控件可能成对使用。对我而言,这是一种需要您实现用户控制的情况。

答案 2 :(得分:0)

我不是webforms专家,但我相信该页面存储了对页面中每个控件的引用。

您可以将网络形状视为一个n-ary树...每个控件都有一个父级,可以有0到多个孩子。因此,如果这些是静态控件,您应该只能获取对其父级的引用并迭代它...而不需要子级的ID。

此外,您可以根据他们的ID查询子项...类似于myControl["myID1"],这样您就可以使用字符串连接数字并以此方式获得控件。

最后,如果这些是纯动态控件,即你不知道它们有多少,只需在有序集合中存储对它们的引用,然后以这种方式迭代它们。

修改

我们走了:

WebControl myControl;
myControl.Controls.Add(someControlReference);

然后,按ID获取控件:

WebControl someControl = myControl.FindControl("someControlID1");

从那里你可以这样做:

string a = someControl.Text