各位好,小弟向大家请教个问题,是这样的:
我在我的网站中建了个主模板Default.Master,然后我在我的网站中的某一页中如Index.aspx中调用了主模板,然后在
<content></content>中放了几个Label控件,然后在后台调用了下面语句:foreach (Control ctrl in this.Page.Controls)
        {   
              string kk="";
            foreach (Control ctl in ctrl.Controls)
            {
              if (ctl.GetType().Name == "Label")
                {
                    Label la=new Label();
                    la=(Label)this.FindControl(ctl.ClientID);
                    kk += la.ClientID;
                }
            }
        }
主要目的是想把这几天Label控件的名称连接起来放到字符串kk中,但我发现kk老是等于空,好像在页面中找不到Label控件,但如果我在页面中不调用主模板,把几个Label控件放到一个空页面时,上面语句就能实现,但一调用主模板就出了问题,到底是怎么回事呢?请知道的帮忙告诉一声.

解决方案 »

  1.   

    ctl.GetType().Name   ==   "Label"
    我的这一句应该没有问题啊,我如果不用主模板时,我试过了,完全没有问题,但一用好像就找不到控件,不知道是什么问题
      

  2.   

    还要加载这个控件.用load,具体代码我忘了...
      

  3.   

    你在第二个循环外层再添加相同的代码试试.
     if   (ctl.GetType().Name   ==   "Label") 
                                    { 
                                            Label   la=new   Label(); 
                                            la=(Label)this.FindControl(ctl.ClientID); 
                                            kk   +=   la.ClientID; }
      

  4.   

    在第二个循环外层再添加相同的代码?这是怎么做的呢,这样的话,
    if   (ctl.GetType().Name   ==   "Label") 
                                    { 
                                            Label   la=new   Label(); 
                                            la=(Label)this.FindControl(ctl.ClientID); 
                                            kk   +=   la.ClientID; }
    变量ctl从哪里来的呢?
      

  5.   

    现在有一个问题就是当你调用了主模板之后,就算你的页面上真的有Label控件,这一句话:if(ctl.GetType().Name   ==   "Label") 老是为假,这就是其真正因为,我想问的就是这个,是为什么呢?
      

  6.   

    這是aspx 中的内容
    <asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
    <div id="div" runat="server">
        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
        <asp:Label ID="Label2" runat="server" Text="Label"></asp:Label>
        <asp:Label ID="Label3" runat="server" Text="Label"></asp:Label>
        <asp:Label ID="Label4" runat="server" Text="Label"></asp:Label>
    </div>
    </asp:Content>運行后發現這部分内容變爲<table width="100%" height="100%" border="0" cellpadding="0" cellspacing="0" class="tbbg01">
                <tr >
                    <td valign="top">
                        
    <div id="ctl00_ContentPlaceHolder1_div">
        <span id="ctl00_ContentPlaceHolder1_Label1">Label</span>
        <span id="ctl00_ContentPlaceHolder1_Label2">Label</span>
        <span id="ctl00_ContentPlaceHolder1_Label3">Label</span>
        <span id="ctl00_ContentPlaceHolder1_Label4">Label</span>
    </div>                </td>
                </tr>
            </table>
      

  7.   

            foreach (Control ctrl in this.Page.Master.Controls)
            {
                string kk = "";
                foreach (Control ctl in ctrl.Controls)
                {
                    if (ctl.ID == "ContentPlaceHolder1")
                    {
                        foreach (Control c in ctl.Controls)
                        {
                            if (c.GetType().Name == "Label")
                            {
                                Label la = new Label();
                                la = (Label)c;
                                kk = la.ClientID;
                                Response.Write(kk+"\n");
                            }
                        }
                    }
                }
            } 
    這樣就可以了
      

  8.   

    結果:
    ctl00_ContentPlaceHolder1_Label1 ctl00_ContentPlaceHolder1_Label2 ctl00_ContentPlaceHolder1_Label3 ctl00_ContentPlaceHolder1_Label4 
      

  9.   

    在第二个循环外层再添加相同的代码?这是怎么做的呢,这样的话, 
    if       (ctl.GetType().Name       ==       "Label")   
                                                                    {   
                                                                                    Label       la=new       Label();   
                                                                                    la=(Label)this.FindControl(ctl.ClientID);   
                                                                                    kk       +=       la.ClientID;   } 变量ctl从哪里来的呢?
    ----------------------------------------------------------
    if       (ctrl.GetType().Name       ==       "Label")   
                                                                    {   
                                                                                    Label       la=new       Label();   
                                                                                    la=(Label)this.FindControl(ctl.ClientID);   
                                                                                    kk       +=       la.ClientID;   } 
    ctrl
      

  10.   

    谢谢,很谢谢nj_1st_excellence 这位兄弟,问题解决,结贴给分
      

  11.   

    晕~你只是想看一看啊?
    能编程输出生成HTML么?
      

  12.   

    哦,明白了,在继承页面中,调用不到ContentPlaceholderId,而是Content的ID只是个引用,比较特殊。
    nj_1st_excellence   这位兄弟的思路是先用this.master引用到master页面,寻找该控件,然后再回返到继承页面中根据该控件找内嵌控件,学习了。
    --------------------------------------------------------------------------------------------------------------
    最后十分感激楼主提了这么好的一个问题和nj_1st_excellence的正确回答。谢谢。