我有一个页面,我动态创建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作为对象类型,这也无济于事。
谢谢!
答案 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中)。
答案 3 :(得分:0)
尝试以下方法:
LiteralControl literalControl = new LiteralControl();
literalControl.ID = "divLiteralControl";
literalControl.Text = ...
subCell.Controls.Add(literalControl);
然后使用FindControl方法获取文字控件并编辑其文本。
LiteralControl literalControl =
(LiteralControl) subCell.FindControl("divLiteralControl");
literalControl.Text = ...