【问题标题】:Why are my Dynamically Generated Controls not taking an ID value为什么我的动态生成的控件不采用 ID 值
【发布时间】:2013-07-17 02:52:30
【问题描述】:

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

我已经单步执行了代码并正在使用递归 FindControl 扩展,但是当它到达动态添加的 textarea 时,它清楚地表明它们具有我设置的 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>

【问题讨论】:

  • 如果您使用 JavaScript 来访问这些项目,是的,全名很重要。 .NET 使用这样的名称是为了使它们独一无二,并且基于控件嵌套在其他控件中的方式。在代码隐藏中,您不必担心呈现的 HTML 中的全名,只需担心您给它们的 id。
  • 您为什么要在代码隐藏中实例化HtmlControls,然后添加属性以使它们像 ASP.NET 服务器控件一样工作?只需让它们作为服务器控件开始,然后将它们注入容器控件的Items 集合中。

标签: asp.net vb.net dynamic


【解决方案1】:

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

Qdiv.ID = question.@Name.ToString & "div"

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

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

您似乎在Attributes 集合中添加了一些应该使用显式控件属性设置的东西。

【讨论】:

    猜你喜欢
    • 2010-10-19
    • 2014-07-08
    • 2013-01-21
    • 1970-01-01
    • 2013-03-01
    • 2013-01-01
    • 2023-03-06
    • 2011-09-19
    • 1970-01-01
    相关资源
    最近更新 更多