首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么动态生成的控件不接受ID值

为什么动态生成的控件不接受ID值
EN

Stack Overflow用户
提问于 2013-07-17 02:28:33
回答 1查看 409关注 0票数 0

我在页面中添加了动态文本区,并在创建它们时为它们设置了名称和I,但是在运行时,所有控件都有类似ctl01的名称。

我已经遍历了代码并使用了递归FindControl扩展,但是当它到达动态添加的文本区时,它会清楚地显示它们具有我设置的ID,但它们的名称是"ctl00$MainContent$ctl03“

我的findcontrol方法失败了,即使我可以清楚地看到控件的ID与我正在搜索的字符串相匹配。但是,如果我将搜索字符串更改为"ctl03“( ASP分配给我的控件的name值),它可以正常工作并找到控件。这让我相信FindControl实际上是按名称而不是ID进行搜索的,如果我可以设置控件的名称,那么就会找到它,即使我明确地这样做了,ASP也拒绝承认。

代码:从"ApplicationForm_PreInit“事件调用以下方法

代码语言:javascript
运行
复制
   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扩展

代码语言:javascript
运行
复制
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

那我就把这个叫做

代码语言:javascript
运行
复制
Dim tb2 = FindControlRecursive(Me, question.@Name.ToString & "tb")

当我在页面上查看源代码时,该控件如下所示

代码语言:javascript
运行
复制
<textarea name="ctl00$MainContent$ctl03" id="Whatcanyouprovidetb" Textmode="MultiLine" runat="server" style="width:45%; height: 50px;"></textarea>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-17 02:35:53

您没有设置控件的ID属性。将"id"添加到它们的属性集合中会使ID属性为空。然后,它由ASP.NET自动分配,以便生成唯一的html id/name值。执行以下操作:

代码语言:javascript
运行
复制
Qdiv.ID = question.@Name.ToString & "div"

lbl1.ID = question.@Name.ToString & "lbl"

tb1.ID = question.@Name.ToString & "tb"

您似乎向Attributes集合添加了许多应使用显式控件属性设置的内容。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17684290

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档