想做一个简单的功能
点击Button1动态生成一个Button2(Button2是不存在的,是动态生成的,回传后会消失),点击Button2能运行服务器端的一段代码,要求:Button2的onclick事件代码不写在js中,回传后button2还在。代码:public partial class Default3 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        Button L_Button = new Button();
        L_Button.ID = "Button2";
        L_Button.Text = "输出";
        L_Button.Attributes.Add("runat", "server");
        L_Button.BackColor = System.Drawing.Color.Blue;
        L_Button.ForeColor = System.Drawing.Color.Wheat;
        L_Button.Click += new EventHandler(this.CCC);//这句话我试着写的,发觉无效       
        Panel1.Controls.Add(L_Button);    }
    protected void CCC(object sender, EventArgs e)
    {
        Response.Write("XXX");
    }
}我是希望点击button2能够运行CCC方法,该怎么写?
这个我可以利用ajax做
写个L_Button.Attributes.Add("OnClick","Button2_Click");然后在前台写一个function Button2_Click()
{
 //调用ajax引擎,执行CCC函数
 ...
}但是我现在想要不借助js和ajax不知该如何实现~~
请各位高手支招!

解决方案 »

  1.   

    你可以把这几句
             L_Button.Attributes.Add("runat", "server");
            L_Button.BackColor = System.Drawing.Color.Blue;
            L_Button.ForeColor = System.Drawing.Color.Wheat;
            L_Button.Click += new EventHandler(this.CCC);//这句话我试着写的,发觉无效       
    换成
             L_Button.BackColor = System.Drawing.Color.Blue;
            L_Button.ForeColor = System.Drawing.Color.Wheat;
            L_Button.Click += new EventHandler(L_Button_Click );          
         protected void L_Button_Click (object sender, EventArgs e)
        {
            Response.Write("XXX");
        }
      

  2.   


    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;public partial class Default9 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack)
            {
                Button L_Button = new Button();
                L_Button.ID = "Button2";
                L_Button.Text = "输出";
                L_Button.Attributes.Add("runat", "server");
                L_Button.BackColor = System.Drawing.Color.Blue;
                L_Button.ForeColor = System.Drawing.Color.Wheat;
                L_Button.Click += new EventHandler(L_Button_Click);
                this.form1.Controls.Add(L_Button);
            }
        }
        protected void Button1_Click(object sender, EventArgs e)
        {
           
        }    void L_Button_Click(object sender, EventArgs e)
        {
            Response.Write("dd");
        }
    }
      

  3.   

    顶ls ,因为是动态创建控件,并给控件注册事件,要保证页面每次刷新时都能加载到此控件的创建放到  if (IsPostBack) 中去执行
      

  4.   

    感谢 lovehongyun ,现在我把代码改成了这样protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack)
            {
                
                Panel1.Controls.Add(Build_Button());
                
            }
        } protected void Button1_Click(object sender, EventArgs e)
        {        
            Panel1.Controls.Add(Build_Button());
        }protected Button Build_Button()
        {
            Button L_Button = new Button();
            L_Button.ID = "Button_2";
            L_Button.Text = "输出";
            L_Button.Attributes.Add("runat", "server");
            L_Button.BackColor = System.Drawing.Color.Blue;
            L_Button.ForeColor = System.Drawing.Color.Wheat;
            //Response.Write("<SCRIPT> function DDD() {alert('XXXX');} </SCRIPT>");
            //L_Button.Attributes.Add("OnClick", "DDD()");
            L_Button.Click += new EventHandler(L_Button_Click);
            return (L_Button);
        }protected void L_Button_Click(object sender, EventArgs e)
        {
            Response.Write("XXX");
        } 
    现在的问题是我希望点击了Button1之后才出现这个动态加载的[输出]按钮,但是如我上面这样写任何回传都会加载这个按钮,并且点击Button1时会出现两个[输出]按钮
    我想到的解决方法是在protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack)
            {
                if([输出]按钮不存在)
                {
                    Panel1.Controls.Add(Build_Button());
                }
                
            }
        }
    现在的问题是怎么判断该按钮不存在呢?我试着用request.form[],但是按钮不被包含在表单内提交,除非是它自身被点击的时候。
    一个解决办法是可以用session存一个变量来指示,但是有没有别的办法可以直接获取浏览器端该按钮的状态呢(比方说能让form每次都提交该按钮的text,如果取不到说明该按钮不存在)?
      

  5.   

    我没测,你自己试试.using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;public partial class Default9 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack)
            {
                if (ViewState["flag"] != null)
                {
                    this.form1.Controls.Add(Build_Button());    
                }
                            
            }
        }
        protected void Button1_Click(object sender, EventArgs e)
        {
            if (ViewState["flag"] == null)
            {
                this.form1.Controls.Add(Build_Button());
                ViewState["flag"] = true;
            }
        }    void L_Button_Click(object sender, EventArgs e)
        {
            Response.Write("dd");
        }    Button Build_Button()
        {
            Button L_Button = new Button();
            L_Button.ID = "Button2";
            L_Button.Text = "输出";
            L_Button.Attributes.Add("runat", "server");
            L_Button.BackColor = System.Drawing.Color.Blue;
            L_Button.ForeColor = System.Drawing.Color.Wheat;
            L_Button.Click += new EventHandler(L_Button_Click);
            return L_Button;
        }}
      

  6.   

    这里使用ViewState比Session更好~~受教了!
    下面是我经过测试了的代码: protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                //Session["Button_2_Exist"] = false;//用来指示其他控件的回传是否创建该按钮
                ViewState["Button_2_Exist"] = false;
            }
            if (IsPostBack)
            {
                if (Request.Form["Button1"] == null)//用来指示button1引发的回传是否创建该按钮
                {
                    if ((bool)ViewState["Button_2_Exist"])
                    {
                        Panel1.Controls.Add(Build_Button());
                    }
                }
            }
        } protected void Button1_Click(object sender, EventArgs e)
        {
            if (!(bool)ViewState["Button_2_Exist"])
            {
                Panel1.Controls.Add(Build_Button());
                ViewState["Button_2_Exist"] = true;
            }
            else
            {
                ViewState["Button_2_Exist"] = false;
            }
        }protected Button Build_Button()
        {
            Button L_Button = new Button();
            L_Button.ID = "Button_2";
            L_Button.Text = "输出";
            L_Button.Attributes.Add("runat", "server");
            L_Button.BackColor = System.Drawing.Color.Blue;
            L_Button.ForeColor = System.Drawing.Color.Wheat;
            //Response.Write("<SCRIPT> function DDD() {alert('XXXX');} </SCRIPT>");
            //L_Button.Attributes.Add("OnClick", "DDD()");
            L_Button.Click += new EventHandler(L_Button_Click);
            return (L_Button);
        } protected void L_Button_Click(object sender, EventArgs e)
        {
            Response.Write("XXX");
        } 
      

  7.   

    这里使用ViewState比Session更好~~受教了!
    下面是我经过测试了的代码: protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                //Session["Button_2_Exist"] = false;//用来指示其他控件的回传是否创建该按钮
                ViewState["Button_2_Exist"] = false;
            }
            if (IsPostBack)
            {
                if (Request.Form["Button1"] == null)//用来指示button1引发的回传是否创建该按钮
                {
                    if ((bool)ViewState["Button_2_Exist"])
                    {
                        Panel1.Controls.Add(Build_Button());
                    }
                }
            }
        } protected void Button1_Click(object sender, EventArgs e)
        {
            if (!(bool)ViewState["Button_2_Exist"])
            {
                Panel1.Controls.Add(Build_Button());
                ViewState["Button_2_Exist"] = true;
            }
            else
            {
                ViewState["Button_2_Exist"] = false;
            }
        }protected Button Build_Button()
        {
            Button L_Button = new Button();
            L_Button.ID = "Button_2";
            L_Button.Text = "输出";
            L_Button.Attributes.Add("runat", "server");
            L_Button.BackColor = System.Drawing.Color.Blue;
            L_Button.ForeColor = System.Drawing.Color.Wheat;
            //Response.Write("<SCRIPT> function DDD() {alert('XXXX');} </SCRIPT>");
            //L_Button.Attributes.Add("OnClick", "DDD()");
            L_Button.Click += new EventHandler(L_Button_Click);
            return (L_Button);
        } protected void L_Button_Click(object sender, EventArgs e)
        {
            Response.Write("XXX");
        } 
      

  8.   

    以前我也做过,这样做就是反复加载Button,其实这里你可以在动态生成Button时后就把button保持到Session里,再在Load里取出加载事件,这样就可以不用反复加载了.跟你上面的比各有优越性