繁体   English   中英

以编程方式生成控件的问题

[英]Problem with programmatically generated controls

public partial class Default2 : System.Web.UI.Page
{

    protected void Page_Load(object sender, EventArgs e)
    {
        GenerateButtons generate = new GenerateButtons();
        generate.Generate5Controls(PlaceHolder1);

    }


}


class GenerateButtons
{
    PlaceHolder placeHolder;
   public  void Generate5Controls(PlaceHolder placeH)
    {
        placeHolder = placeH;
        for (int i = 0; i < 5; i++)
        {
            Button newBtn = new Button();
            newBtn.Click += btn_Click;
            newBtn.Text = "PageLoadButton Created. Number: "+i;
            placeHolder.Controls.Add(newBtn);
        }
    }
    public void btn_Click(object sender, EventArgs e)
    {
        Button newBTN = new Button();
        newBTN.Text = "A New Button was added by the button event btn_click";
        newBTN.Click += btn2_Click;
        placeHolder.Controls.Add(newBTN);

    }
    public void btn2_Click(object sender, EventArgs e)
    {
        Button newBTN = new Button();
        newBTN.Text = "A New Button was added by the button event btn2_click";
        placeHolder.Controls.Add(newBTN);
    }
}

我希望事件btn_click和btn2_click触发每个帖子回发。当我单击以编程方式创建的按钮时,它在每次回发后消失,并且其事件不触发(btn2_click)。 我知道我可以在回发时生成按钮。但是我不想这样做! 我想知道如何更新占位符的状态...,以便出现唯一按钮,Generate5Controls(PlaceHolder placeH)中生成的5个按钮消失。

我可以使用布尔Viewstate来防止这种情况的发生。Generate5Controls(PlaceHolder1); 从被执行

但是问题是如何使以编程方式生成的按钮出现!

您应该在每个PostBack上生成控件,也可以一次生成控件,将其保存在会话中,并在page_load事件中从会话添加生成的控件。

protected void Page_Load(object sender, EventArgs e)
    {
       if(Session["GeneratedButtons"] == null)
       {
          GenerateButtons generate = new GenerateButtons();
          generate.Generate5Controls(PlaceHolder1);
       }
       else
       {
           List<Control> generatedControls = Session["GeneratedButtons"] as List<Control>;
           foreach(Control oneControl in generatedControls)
           {
               PlaceHolder1.Controls.Add(oneControl);
           }
       }
    }

class GenerateButtons
{
    PlaceHolder placeHolder;
   public  void Generate5Controls(PlaceHolder placeH)
    {
        placeHolder = placeH;
        List<Control> generatedControls = new List<Control>();
        for (int i = 0; i < 5; i++)
        {
            Button newBtn = new Button();
            newBtn.Click += btn_Click;
            newBtn.Text = "PageLoadButton Created. Number: "+i;
            placeHolder.Controls.Add(newBtn);
            AddControlToSession(newBtn);
        }
    }
    public void btn_Click(object sender, EventArgs e)
    {
        Button newBTN = new Button();
        newBTN.Text = "A New Button was added by the button event btn_click";
        newBTN.Click += btn2_Click;
        placeHolder.Controls.Add(newBTN);
        AddControlToSession(newBtn);
    }

    public void btn2_Click(object sender, EventArgs e)
    {
        Button newBTN = new Button();
        newBTN.Text = "A New Button was added by the button event btn2_click";
        placeHolder.Controls.Add(newBTN);
        AddControlToSession(newBtn);
    }

    private void AddControlToSession(Control ctrl)
    {
        List<Control> generatedControls = Session["GeneratedButtons"] as List<Control>;
        if(generatedControls == null)
        {
            generatedControls = new List<Control>();
        }
        generatedControls.Add(ctrl);
        Session["GeneratedButtons"] = generatedControls;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM