访问"HtmlGenericControl"从动态创建控件的母版页中删除
本文关键字:quot 母版页 删除 控件 动态 HtmlGenericControl 访问 创建 | 更新日期: 2023-09-27 18:17:18
我有一个母版页"默认。和一个内容页面"Store"。,每个都有自己的代码隐藏页面。在母版页的后台代码中,我动态地创建了一个带有一些文本的标签。我想在'Store.aspx.cs'的代码后面页面中查找标签的文本,但我的代码返回'null'控件…
在我的default.master.cs页面加载:
<label runat='"server'" id='"displayname'"><a href='MyAvatar.aspx'>" + displayName + "</a></label>
在我的Store.aspx.cs页面加载:
HtmlGenericControl dName = (HtmlGenericControl)Master.FindControl("displayName");
if (dName != null)
Debug.Print("dName: " + dName.InnerText);
This does NOT work…但是,如果我将标签直接放在默认值中。主页像这样:
<label runat="server" id="displayName">TEST</label>
然后当我加载商店。在我的Debug输出中,我清楚地看到:
dName: TEST
我真的需要动态创建标签,并且不仅需要能够从Store.aspx.cs访问标签的内容,还需要能够从其他2个页面访问标签的内容(将来可能会更多)。有什么想法?
编辑:我只是想指出,动态创建的标签是一个更大的元素的一部分…标签在表格单元格内,在表格行内,在表格内,所有这些都在文字控件内…管他呢,为什么不把整个粘贴在这里呢?(标签在第4行)
userCP.Text = "<table width=100% border=0 cellpadding=0 cellspacing=0>" +
"<tr><td colspan=4 style='"font-size: large'"><center><b>Welcome,</b></center></td></tr>" +
"<tr style='"height: 5px; '"><td colspan=4></td></tr>" +
"<tr><td colspan=4><center><label runat='"server'" id='"displayname'"><a href='MyAvatar.aspx'>" + displayName + "</a></label></center></td></tr>" +
"<tr style='"height: 5px; '"><td colspan=4></td></tr>" +
"<tr><td colspan=4><hr/></td></tr>" +
"<tr><td>" + leaderLink + "</td><td width=100% id='"userCP_bones'" style='"text-align:right; '">" + bones + "</td><td style='"text-align:left;'"><b>/</b><a href='Store.aspx?SC=Acct' title='Click to upgrade your wallet!'>" + maxBones + "</a></td><td><center><img src='images/bone.png' alt='Bones' align='right' style='"vertical-align:middle'"/></center></td></tr>" +
"<tr><td></td><td></td><td id='CartCount' style='"text-align:right; text-decoration: underline; cursor:pointer; '"><a href='Checkout.aspx'>" + itemCount + "</a></td><td width=10%><center><a href='Checkout.aspx'><img src='images/cart.png' onmouseover='"this.src='images/cart_h.png''" onmouseout='"this.src='images/cart.png''" height='24' width='24' alt='Cart' align='right' style='"vertical-align:middle; border:none'"/></a></center></td></tr>" +
"</table>";
编辑:根据给出的第一个答案,我没有使用"userCP"的文字控件,而是将其转换为一个ASP表,并在代码后面添加行/单元格:
//Row for display name
TableRow r = new TableRow();
userCP.Rows.Add(r);
TableCell c = new TableCell();
r.Cells.Add(c);
c.ColumnSpan = 4;
Label l = new Label();
l.Text = "<center><a href='MyAvatar.aspx'>" + displayName + "</a></center>";
l.ID = "displayName";
c.Controls.Add(l);
我的store.aspx.cs仍然返回null当执行:
Debug.Print("Name: " + Master.FindControl("displayName"));
即使我强制转换查找:
(HtmlGenericControl)Master.FindControl("displayName")
(Label)Master.FindControl("displayName")
您不能通过从代码中直接操作页面标记来添加服务器端控件,因为那时页面已经创建好了。如果您想动态创建控件,然后从服务器端代码访问它们,您需要将它们添加到Controls
集合。
你必须建立你的ASP。Net HtmlTable
服务器端控件(包括HtmlTableRow
和表HtmlTableCell
以及所有相关控件)通过实际的服务器端代码,并将结果表添加到userCP中,例如userCP.Controls.Add(myCreatedTable)
只是为了清理、澄清和集中答案和评论:
如果我使用LiteralControl或Asp:Table没关系,我需要的'displayName'现在存储为default.master.cs文件中的全局变量:
string displayName = "Guest";
public string dName()
{
return displayName;
}
可以从任何内容页中查找,使用:
//Make sure the user has an account
string dName = ((_default)Master).dName();
if (dName == "Guest")
{
LiteralStoreHeader.Text = "<center><b>We're Sorry!</b><br/>You must have an Avatar account to view this page.</center>";
return;
}
但是,如果我真的需要从表中的单元格中提取信息,而不将其存储为default.master.cs页面上的变量,我也可以通过使用ASP表而不是LiteralControl,然后查找标签的id来做到这一点:
主代码文件:
Label l;
public string FOO()
{
return l.Text;
}
protected void Page_Load(object sender, EventArgs e)
{
l = new Label();
l.Text = "Bar";
}
内容代码文件:
string dName = ((_default)Master).FOO();