从动态创建控件的母版页访问“HtmlGenericControl”

时间:2013-06-05 17:45:31

标签: c# asp.net dynamic findcontrol

我有一个母版页“default.master”和一个内容页面“Store.aspx”,每个页面都有自己的代码隐藏页面。在母版页的代码隐藏中,我正在动态创建一个带有一些文本的标签。我想在代码隐藏页面中查找“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);

这不起作用......但是,如果我将标签直接放在default.master页面中,如下所示:

<label runat="server" id="displayName">TEST</label>

然后当我加载Store.aspx时,我清楚地看到我的调试输出:

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>";

编辑: 基于给出的第一个答案,我将其转换为ASP表并在代码隐藏中添加行/单元,而不是“userCP”的文字控件:

//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")

2 个答案:

答案 0 :(得分:1)

您无法通过直接操作代码中的页面标记来添加服务器端控件,因为此时已经创建了页面。如果要动态创建控件,然后从服务器端代码访问它们,则需要将它们添加到Controls集合中。

您必须通过实际的服务器端代码构建ASP.Net HtmlTable服务器端控件(包括HtmlTableRow和表HtmlTableCell以及所有相关控件)并添加结果使用类似userCP.Controls.Add(myCreatedTable)

的表格向userCP表

答案 1 :(得分:0)

只是为了清理,澄清和集中答案和评论:

如果我使用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();