Page.FindControl comes back null for DIV

本文关键字:for DIV null back FindControl comes Page | 更新日期: 2023-09-27 17:58:12

我有一个页面,在那里我动态创建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();

在这行代码之后,我得到了一个null对象ref错误。div为null。我尝试过将HtmlControl和LiteralControl作为对象类型,但这也没有帮助。

谢谢!

Page.FindControl comes back null for DIV

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

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

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

页面加载中:

    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>

您必须在OnInit事件和回发时事件中添加动态控件。如果不是,则所有控件在回发时都不可见如何使用Visual C#.NET在ASP.NET中动态创建控件

注意创建动态控件时在Web窗体上,控件必须创建并添加到控件集合在OnInit或中Page_Load事件。否则控件的行为出乎意料。

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

看看这里。。。在ASP.NET 中查找控件的更好方法

尝试以下操作:

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

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

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