我有几个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
需要你们的帮助才能做到这一点!感谢....
答案 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