aspx:
@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm5.aspx.cs" Inherits="WebApp.WebForm5" %><%@ Register src="WebUserControl1.ascx" tagname="WebUserControl1" tagprefix="uc1" %>
<%@ Register src="WebUserControl2.ascx" tagname="WebUserControl2" tagprefix="uc2" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>无标题页</title>
</head>
<body>
    <form id="form1" runat="server">
    <div >
    
        <asp:Panel ID="Panel1" runat="server">
        </asp:Panel>
    
    </div>
    <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="显示1" />
    <asp:Button ID="Button2" runat="server" Text="显示2" onclick="Button2_Click" />
    <asp:Button ID="Button3" runat="server" onclick="Button3_Click" 
        Text="用户控件里按钮的Text" />
    </form>
</body>
</html>
-----------------------------------------------------------------------------------------------------
cs:
protected void Page_Load(object sender, EventArgs e)
        {            if (!Page.IsPostBack)
            {
                Session["cname"] = "WebUserControl1.ascx";
 
            }
            addcontrol();        }        protected void Button1_Click(object sender, EventArgs e)
        {
            Session["cname"] = "WebUserControl1.ascx";
            addcontrol();        }        protected void Button2_Click(object sender, EventArgs e)
        {
            Session["cname"] = "WebUserControl2.ascx";
            addcontrol();
        }        void addcontrol()
        {
            Control uc = LoadControl(Session["cname"].ToString());
            Panel1.Controls.Clear();
            Panel1.Controls.Add(uc);        }        protected void Button3_Click(object sender, EventArgs e)
        {
            Response.Write((Panel1.Controls[0].Controls[0] as Button).Text);
        }
--------------------------------------------------------------------------------------
WebUserControl1.ascx
html:<asp:Button ID="Button1" runat="server" Text="b1" onclick="Button1_Click" 
    Width="158px" />cs:protected void Page_Load(object sender, EventArgs e)
        {
            Button1.Text = "第一个:1";        }        protected void Button1_Click(object sender, EventArgs e)
        {
            Button1.Text = "第一个:2";
        }
-----------------------------------------------------------------------------------------WebUserControl2.ascx
html:
<asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />cs: protected void Page_Load(object sender, EventArgs e)
        {
            Button1.Text = "第二个:1";        }        protected void Button1_Click(object sender, EventArgs e)
        {
            Button1.Text = "第二个:2";
        }
-----------------------------------------------------------------------------------------
为什么交替显示后,控件里面的按钮要点两次才能相应,而且用户控件里按钮的Text 总是获取不到

解决方案 »

  1.   

    加载控件页面,,跟控件页面的button命名...最好不一样..  试试看..
      

  2.   

    protected void Page_Load(object sender, EventArgs e)
      {  if (!Page.IsPostBack)
      {
      Session["cname"] = "WebUserControl1.ascx";//这里,页面第一次加载时会执行一次
      
      }
      addcontrol();//但是这里,页面第一次加载或者你点击当前页面上的任何按钮,它都会再次执行一次,
    //比如你点击WebUserControl2.ascx用户控件里的那个按钮的protected void Button1_Click(object sender, EventArgs e)事件,则页面在回调时,照样会先执行addcontrol();一次,才接着去执行protected void Button1_Click(object sender, EventArgs e)事件
      }
    //再来分析一下你的这个动态加载控件的方法
    void addcontrol()
      {
      Control uc = LoadControl(Session["cname"].ToString());
      Panel1.Controls.Clear();//注意这里,你每次调用这个方法时,都会清空Panel1容器里的控件哦,所以,你的Panel1容器永远只有一个子控件
      Panel1.Controls.Add(uc);  }
    //然后我们再来看看你的这个取Panel1容器里的子控件的方法:protected void Button3_Click(object sender, EventArgs e)
      {
      Response.Write((Panel1.Controls[0].Controls[0] as Button).Text);//正如我上面所提到的,你添加控件时,每次都先清空旧子控件,则Panel1容器里实际上只有一个子控件,你现在Panel1.Controls[0].Controls[0]怎么可能取得到对象?
      }
    //建议楼主先理解
    protected void Page_Load(object sender, EventArgs e)
    这个事件是无论如何都会被再次执行的,无论是第一次还是点击按钮回调什么的,反正请求服务器,服务器需要重新构造页面对象(就是要给网民看的网页),它都会执行,除非用了缓存,
    //而且你要清楚,是先执行Page_Load事件,才后面执行Button3_Click这种点击事件的,别把顺序搞乱了//如果你理解了它们的执行顺序后,请楼主自己从头到尾地在脑海里模仿一下你的代码,一步步执行下去,就明白为什么代码有问题了
      

  3.   

    你说的很对,我也知道
    我之所以这样做,如果不在Page_load中重新加载,我在按钮事件中将获取不到自定义控件中的内容,
    我也知道我的代码有问题,
    就是想请教一下问题出在哪里呢
      

  4.   

    protected void Page_Load(object sender, EventArgs e)
      {  if (!Page.IsPostBack)
      {
      Session["cname"] = "WebUserControl1.ascx";
      
      }
      addcontrol();  }//改为
    protected void Page_Load(object sender, EventArgs e)
      {  if (!Page.IsPostBack)
      {
      Session["cname"] = "WebUserControl1.ascx";
      addcontrol();  }
      
      }//试下,其它先不变