访问"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")

访问"HtmlGenericControl"从动态创建控件的母版页中删除

您不能通过从代码中直接操作页面标记来添加服务器端控件,因为那时页面已经创建好了。如果您想动态创建控件,然后从服务器端代码访问它们,您需要将它们添加到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();