我只做了一个小试验,代码很简单。有兴趣的人也可以试一下。
我在sf_manage.ascx中只放了一个按钮,给写了个事件,并在上面设了个断点。
在一个WEB窗体上,放了一个panel控件,我写下了以下两个函数:
private void Page_Load(object sender, System.EventArgs e)
{
Panel1.Controls.Add(LoadControl("sf_manage.ascx"));
}
         private void Button1_Click(object sender, System.EventArgs e)
{
Panel1.Controls.Add(LoadControl("sf_manage.ascx"));

}
放在这两个不同的函数内,有不同的结果,
放在Page_Load中时,单击sf_manage.ascx中的按钮,有事件响应。
但是Button1_Click中时,单击sf_manage.ascx中的按钮,就没有事件响应了。
1。请高手们给我解释一下原因:
2。此时,我要单击web窗体上的按钮,让panel动态的加载不同的用户控件,而且用户控件能自己响应事件(但是这是用户控件上不响应事件了呀),怎么解决?

解决方案 »

  1.   

    private void Page_Load(object sender, System.EventArgs e)
    {
                if(!IsPostBack)
                {
    Panel1.Controls.Add(LoadControl("sf_manage.ascx"));     
                }  
    }
             private void Button1_Click(object sender, System.EventArgs e)
    {
    Panel1.Controls.Add(LoadControl("sf_manage.ascx"));

    }
      

  2.   

    因为在LOAD里面的时候 每次都能先加载事件 后面执行!而写在 CLICK里面 单机 是最后执行了加载所有 没有效果
      

  3.   

    你可以参考下这个文章:http://blog.csdn.net/TechnoFantasy/archive/2005/08/18/458140.aspx里面就ASP.NET页面生命周期中的各个事件的执行顺序以及所执行的动作做了说明
      

  4.   

    不论你在事件之中为Panel里边装了什么用户控件,页面再次提交之后,pageLoad事件结束之前必须重新装入同一个用户控件,并且ID相同或者在控件数相对位置(index)必须相同,否则asp.net发现控件不存在,是不会触发控件上的事件的。第一:要用viewState记住你当前正在使用哪个用户控件。在按钮事件中装入用户控件,并给这个ViewState赋值。第二:在页面装入的时候要根据ViewState的值装入上次页面输出之前装入的那个用户控件,不要方法isPostBack判断里。
      

  5.   

    不要方法isPostBack判断里  -->  不要放在isPostBack判断里。
      

  6.   

    sp1234(在找托管服务器)
       果然精通,看来你是真正的高手.
    TechnoFantasy(冰儿马甲www.applevb.com) 提供的文章,看来还不适合我这个层面上的人去理解,
    总之一句话,看不懂,
       还请(在找托管服务器) 给点代码明示.
      

  7.   

    你这个Button1_Click()处理程序不能放在web窗体里,应该在用户控件里声明吧?
      

  8.   

    你可以参考Community StarterKit 的做法,很不错
      

  9.   

    单击按钮只会触发用户控件里的Button1_Click,而不是你上面页面的
      

  10.   

    不放在IsPostBack里,单击后按钮是有,但是却没有执行Button1_Click,不信你试试。在Button1_Click里加一个Response.Write("处理了");验证一下。
    应该这样做:
    public void Button1_Click(object sender, System.EventArgs e)
    {
    Control crtl = LoadControl("WebUserControl.ascx");
    Panel1.Controls.Add(crtl);
    ((Button)crtl.FindControl("Button1")).Click +=this.Button2_Click;
    Panel1.Controls.Add(new LiteralControl("load事件")); }
    再加一个oninit事件:
    void Page_Init(object s, EventArgs e) {
    Control control1 = LoadControl("WebUserControl.ascx");
    Panel1.Controls.Add(control1);
    Button button1 = (Button)control1.FindControl("Button1");
    button1.Click += this.Button1_Click; }
    试试看,不知道可以不?
      

  11.   

    对不起,Butonn1_Click 的这两行去掉 Panel1.Controls.Add(crtl);
    ((Button)crtl.FindControl("Button1")).Click +=this.Button2_Click;
      

  12.   

    大致是:private void Page_Load(object sender, System.EventArgs e)
    {
      LoadUC();
    }private void LoadUC(){
      Panel1.Clear();
      if(ViewState["initUC"]!=null){
        UserControl UC=LoadControl(ViewState["initUC"]);
        UC.ID="InnerUC";
        Panel1.Controls.Add(UC);
      }
    }private void Button1_Click(object sender, System.EventArgs e)
    {
      ViewState["initUC"]="sf_manage.ascx";
      LoadUC();
    }不过我一般不是在PageLoad中装控件,而是在createChildControls中装的。在次大概没有什么影响。
      

  13.   

    UserControl UC=LoadControl((string)ViewState["initUC"]);
      

  14.   

    有人能告诉我怎么处理这样一个字节数组吗?问了好久没有人会。数组前端有一个字符串,后段是二进制数据,两者的分界是连续的"\r\n\r\n",即四个回车或换行符,怎么样把字符串和二进制数据提取出来?语言用C#
      

  15.   

    懒一点的方法是,转化成sting类,用string 类的IndexOf和LastIndexOf 去匹配吧.
         我的问题由 sp1234(在找托管服务器) 圆满的解决了,在这很感谢这位同仁.
    我想把这微薄的60分都给他,相信大家没什么意见吧.呵呵.
         这里还想请教你一个问题,其实我的WEB页上有很多个按钮,每次单击我想让panel只加载一个控件,第一次单击是可以的,因为这时大家的ViewState都为null,
    但是,我单击了第二个,第三个的时候,这时的panel就不再只加载一个控件了,因为这时其它的ViewState也不为空了,而且我这个问题在每个按钮事件上给其它的ViewState设为空也没得解决,不是是什么原因?
             private void loadUC()
    {
    Panel1.Controls.Clear();
    if(ViewState["add"]!=null)
    {
    UserControl UC1=(UserControl)LoadControl((string)ViewState["add"]);
    UC1.ID="uc_add";
    Panel1.Controls.Add(UC1);
    }
    if(ViewState["check"]!=null)
    {
    UserControl UC2=(UserControl)LoadControl((string)ViewState["check"]);
    UC2.ID="uc_check";
    Panel1.Controls.Add(UC2);
    }
    if(ViewState["manage"]!=null)
    {
    UserControl UC3=(UserControl)LoadControl((string)ViewState["manage"]);
    UC3.ID="uc_manage";
    Panel1.Controls.Add(UC3);
    }
    }
      

  16.   

    你的代码的思路适合用来在panel中加在多种用户控件,而不是一个。如果panel内只加载一个,那么只需要针对加载的控件设置单独的一个ViewState元素(Item),不需要针对按钮设置多个ViewState元素。应该:private void ButtonAdd_Click(object sender, System.EventArgs e)
    {
      ViewState["initUC"]="sf_add.ascx";
      LoadUC();
    }private void ButtonCheck_Click(object sender, System.EventArgs e)
    {
      ViewState["initUC"]="sf_check.ascx";
      LoadUC();
    }private void ButtonManageClick(object sender, System.EventArgs e)
    {
      ViewState["initUC"]="sf_manage.ascx";
      LoadUC();
    }而Page_load 和 LoadUC 的代码不变,仍然是只加载ViewState中记住的那一个。
    使用你的方法,可以在Panel中加载多个用户控件,也可以“在每个按钮事件上给其它的ViewState设为空”来使其它用户控件不加载,你的代码看不出为什么出错。你应该在按钮事件中设置断点,然后打开监视窗口设置变量监视,单步执行,察看那些ViewState值何时变化。