我将动态文本区域添加到我的页面并在创建它们时为它们设置名称和 ID,但是在运行时所有控件都具有类似 ctl01 的名称。
我已经逐步完成了代码并正在使用递归 FindControl 扩展,但是当它到达动态添加的文本区域时,它清楚地表明它们具有我设置的 ID,但它们的名称是“ctl00$MainContent$ctl03”
即使我可以清楚地看到控件的 ID 与我正在搜索的字符串匹配,我的 findcontrol 方法也会失败。但是,如果我将搜索字符串更改为“ctl03”(ASP 分配给我的控件的名称值),它可以正常工作并找到控件。这让我相信 FindControl 实际上是按名称而不是 ID 搜索的。如果我可以设置控件的名称,即使我明确地这样做,ASP 也拒绝承认,这会找到。
代码:从“ApplicationForm_PreInit”事件调用以下方法
Private Sub AddSupplementalQuestions()
For Each question In Board.ApplicationXML.<BoardorCommission>.<Questions>.<Question>
Dim Qdiv As New HtmlControls.HtmlGenericControl("div")
Qdiv.Attributes.Add("id", question.@Name.ToString & "div")
Dim lbl1 As New HtmlControls.HtmlGenericControl("Label")
lbl1.Attributes.Add("id", question.@Name.ToString & "lbl")
lbl1.InnerHtml = question.<QuestionText>.Value
Qdiv.Controls.Add(lbl1)
Dim br2 As New HtmlControls.HtmlGenericControl("br")
Qdiv.Controls.Add(br2)
Dim tb1 As New HtmlControls.HtmlTextArea
tb1.Attributes.Add("id", question.@Name.ToString & "tb")
tb1.Attributes.Add("Textmode", "Multiline")
tb1.Attributes.Add("runat", "server")
tb1.Attributes.Add("name", question.@Name.ToString & "tb")
tb1.Attributes.Add("style", "width:45%; height: 50px;")
tb1.Attributes.Add("TextMode", "MultiLine")
Qdiv.Controls.Add(tb1)
ControlstoAdd.Add(Qdiv)
Next
End Sub
这是我的递归 FindControl 扩展
Function FindControlRecursive(ByVal ctrl As Control, ByVal id As String) As Control
Dim c As Control = Nothing
If ctrl.ID = id Then
c = ctrl
Else
For Each childCtrl In ctrl.Controls
Dim resCtrl As Control = FindControlRecursive(childCtrl, id)
If resCtrl IsNot Nothing Then c = resCtrl
Next
End If
Return c
End Function
然后我打电话给这个
Dim tb2 = FindControlRecursive(Me, question.@Name.ToString & "tb")
这应该会发现控件没有问题,但事实并非如此。当我在页面上查看源代码时,控件如下所示
<textarea name="ctl00$MainContent$ctl03" id="Whatcanyouprovidetb" Textmode="MultiLine" runat="server" style="width:45%; height: 50px;"></textarea>