对于DIV,Page.FindControl返回null

时间:2011-06-01 07:37:37

标签: c# asp.net html

我有一个页面,我动态创建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对象引用错误。 div为null。 我已经尝试过HtmlControl和LiteralControl作为对象类型,这也无济于事。

谢谢!

4 个答案:

答案 0 :(得分:4)

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 :(得分:0)

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

  

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

尝试以下方法:

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

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

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