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仅适用于服务器控件。您正在为文字控件中的文本分配一个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 = ...