【问题标题】:Page.FindControl comes back null for DIVPage.FindControl 为 DIV 返回 null
【发布时间】:2011-09-06 01:36:54
【问题描述】:

我有一个页面,我可以在其中动态创建 div 控件并自动编号。

subCell = new TableCell();
subCell.Controls.Add(new LiteralControl(
    "<div id=\"picker" + Index.ToString() + "\" runat=\"server\" 
     class=\"colorSelector\"><div style=\"background-color: #000000;\">Text
     </div></div>"));
subRow.Cells.Add(subCell);
subTb.Rows.Add(subRow);

稍后在代码中我想像这样获取背景颜色值:

HtmlGenericControl div;

div = (HtmlGenericControl)Page.FindControl("picker" + e.CommandArgument.ToString());

string colorCode = div.Style["background-color"].ToString();

在这行代码之后,我得到一个空对象引用错误。 div 为空。 我已经尝试将 HtmlControl 和 LiteralControl 作为对象类型,但这也无济于事。

谢谢!

【问题讨论】:

    标签: c# asp.net html


    【解决方案1】:

    Page.FindControl 仅适用于服务器控件。您正在为文字控件中的文本分配一个 id,该控件恰好是一个 div,而不是控件本身。如果你设置了控件的 id 你应该可以找到它,但我不知道这是否是你想要的。

    针对您的评论,请检查您的 HTML。 runat=server 可能会在那里,因为 ASP.NET 没有将其作为控件处理,而是将其视为内容。尝试这样的事情,注意 Page.FindControl 仅适用于直系子女。在这里,我在 aspx 中声明了一个名为“declaredPanel”的服务器面板。 ClientIdMode.Static 使得 ASP.NET 不会向控件添加父名称(如“MainContent_childPanel”)

    <asp:Panel ID="declaredPanel" runat="server" ClientIDMode="Static" />
    

    在 Page_Load 中:

        Panel p = new Panel();
        p.Style["background-color"] = "#aaeeaa";
        p.ID = "childPanel";
        p.ClientIDMode = System.Web.UI.ClientIDMode.Static;
        p.Controls.Add(new LiteralControl("<div id=\"div111\" runat=\"server\">Hello, world!</div>"));
        declaredPanel.Controls.Add(p);
        Panel p2 = declaredPanel.FindControl("childPanel") as Panel;
        string colorCode = p2.Style["background-color"]; // reports "#aaeeaa"
    

    产生这个:

    <div id="declaredPanel">
        <div id="childPanel" style="background-color:#aaeeaa;">
            <div id="div111" runat="server">Hello, world!</div>
        </div>
    </div>
    

    【讨论】:

    • +1。另外 div 不是控件,也不会发布到服务器。
    • 但是添加 runat="server" 不会使其成为服务器控件吗?我可以直接访问控件吗?
    【解决方案2】:

    您必须在 OnInit 事件和回发事件中添加动态控件。如果不是 - 所有控件在回发时都将不可见 HOW TO: Dynamically Create Controls in ASP.NET by Using Visual C# .NET

    注意创建动态控件时 在 Web 窗体上,控件必须是 创建并添加到控件 在 OnInit 或 Page_Load 事件。否则,该 控件行为异常。

    【讨论】:

      【解决方案3】:

      使用 Panel 而不是 LiteralControl。它将呈现为 DIV,并由FindControl 通过其 ID 找到。您找不到 div,因为它被“包装”在 LiteralControl 中。 Control.FindControl 在当前 NamingContainer 中搜索具有给定 ID 的控件 (runat=server)。请记住,FindControl 不会递归地找到元素(例如,在页面上的所有 TableCells 中)。

      看看这里...Better way to find control in ASP.NET

      【讨论】:

        【解决方案4】:

        尝试以下方法:

        LiteralControl literalControl = new LiteralControl();
        literalControl.ID = "divLiteralControl";
        literalControl.Text = ...
        subCell.Controls.Add(literalControl);
        

        然后使用 FindControl 方法获取文字控件并编辑其文本。

        LiteralControl literalControl = 
            (LiteralControl) subCell.FindControl("divLiteralControl");
        literalControl.Text = ...
        

        【讨论】:

          猜你喜欢
          • 2014-03-06
          • 1970-01-01
          • 2011-04-10
          • 1970-01-01
          • 1970-01-01
          • 2016-12-28
          • 1970-01-01
          • 2022-12-26
          • 2011-08-03
          相关资源
          最近更新 更多