C# 动态c asp.net控件更新的问题

C# 动态c asp.net控件更新的问题,c#,asp.net,webforms,dynamic-controls,C#,Asp.net,Webforms,Dynamic Controls,我目前正在使用c和asp.net开发一个网站。为此,我需要创建动态控件,但遇到了一些问题。我已经阅读了官方文档并搜索了大量教程,但不幸的是,没有人允许我解决这个问题 这是一个非常简单的例子,我正在尝试做什么 protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) CreateControls(); else UpdatePage(); } protected

我目前正在使用c和asp.net开发一个网站。为此,我需要创建动态控件,但遇到了一些问题。我已经阅读了官方文档并搜索了大量教程,但不幸的是,没有人允许我解决这个问题

这是一个非常简单的例子,我正在尝试做什么

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
        CreateControls();
    else
        UpdatePage();
}

protected void CreateControls()
{
    Button button1 = new Button();
    button1.ID = "_Button1";
    button1.Text = "Button1";
    button1.Click += new System.EventHandler(_ClickEvent);
    _Panel.Controls.Add(button1);

    Button button2 = new Button();
    button2.ID = "_Button2";
    button2.Text = "Button2";
    button2.Click += new System.EventHandler(_ClickEvent);
    _Panel.Controls.Add(button2);
}

protected void UpdatePage()
{
    Button button1 = ((Button)_Panel.FindControl("_Button1"));
    button1.Text = "I went through UpdatePage and changed";

    Button button2 = ((Button)_Panel.FindControl("_Button2"));
    button1.Text = "I went through UpdatePage and changed";
}

protected void _ClickEvent(object sender, EventArgs e)
{

}
这里的目的只是在单击其中一个按钮时更改按钮的文本。Page_Load方法与UpdatePage方法一样被正确调用,但在后者中,Button1和Button2控件已消失,它们不再位于面板控件中,并且明显引发了NullPointer异常

有人能解释一下吗?我知道我可能错过了一些关于页面生命周期的内容,但在任何地方都找不到任何明确的解决方案


非常感谢

您动态创建的控件将在回发时丢失。试试这个:

protected void Page_Load(object sender, EventArgs e)
{
        CreateControls();
        UpdatePage();
}

protected void CreateControls()
{
    Button button1 = new Button();
    button1.ID = "_Button1";
    button1.Text = "Button1";
    button1.Click += new System.EventHandler(_ClickEvent);
    _Panel.Controls.Add(button1);

    Button button2 = new Button();
    button2.ID = "_Button2";
    button2.Text = "Button2";
    button2.Click += new System.EventHandler(_ClickEvent);
    _Panel.Controls.Add(button2);
}

protected void UpdatePage()
{
    Button button1 = ((Button)_Panel.FindControl("_Button1"));
    button1.Text = "I went through UpdatePage and changed";

    Button button2 = ((Button)_Panel.FindControl("_Button2"));
    button1.Text = "I went through UpdatePage and changed";
}

protected void _ClickEvent(object sender, EventArgs e)
{

}
我将尝试:

    protected String TextButton1
    {
        get { return (String) ViewState["TextButton1"]; }
        set { ViewState["TextButton1"] = value; }
    }

    protected String TextButton2
    {
        get { return (String)ViewState["TextButton2"]; }
        set { ViewState["TextButton2"] = value; }
    }

    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);
        CreateControls();
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack)
        {
            UpdatePage();
        }
    }

    protected void CreateControls()
    {
        Button button1 = new Button();
        button1.ID = "_Button1";
        button1.Text = String.IsNullOrEmpty(TextButton1) ? "The First Value" : TextButton1; 
        button1.Click += new System.EventHandler(_ClickEvent1);
        _Panel.Controls.Add(button1);

        Button button2 = new Button();
        button2.ID = "_Button2";
        button2.Text = String.IsNullOrEmpty(TextButton2) ? "The First Value" : TextButton2; 
        button2.Click += new System.EventHandler(_ClickEvent2);
        _Panel.Controls.Add(button2);
    }

    protected void UpdatePage()
    {
        Button button1 = ((Button)_Panel.FindControl("_Button1"));
        button1.Text = String.IsNullOrEmpty(TextButton1) ? "The First Value" : TextButton1; 

        Button button2 = ((Button)_Panel.FindControl("_Button2"));
        button2.Text = String.IsNullOrEmpty(TextButton2) ? "The First Value" : TextButton2; 
    }

    protected void _ClickEvent1(object sender, EventArgs e)
    {
        TextButton1 = "test";
        Button b = (Button) sender ;
        b.Text = TextButton1;
    }

    protected void _ClickEvent2(object sender, EventArgs e)
    {
        TextButton2 = "test";
        Button b = (Button)sender;
        b.Text = TextButton2;
    }

您是在第一次加载页面时创建控件的,但是page_Load事件太晚了,无法向页面添加控件并让WebForms知道这一点

在初始页面加载时,在OnInit和page_加载之间的某个地方,WebForms记录页面上当前有哪些控件,并将它们设置为视图状态以及所有这些内容,以便下次发回时它们知道这些控件应该在那里。如果在页面加载之前不添加控件,WebForms将不再关注您要添加到页面中的内容,因此下次您发回时,他们将不知道如何将这些控件放在页面上

将CreateControls调用移动到OnInit方法中。这将告诉WebForms在适当的时间创建控件,与添加.aspx标记中的任何控件的时间大致相同,尽管稍晚。然后WebForms会意识到这些控件,如果是回发,会应用任何必要的视图状态,最后在Page_Load上,您可以通过UpdatePage调用处理控件数据

protected override void OnInit(EventArgs e)
{
     base.OnInit(e);
     CreateControls();
}
将OnInit视为将所有控件放在页面上并连接事件处理程序


将页面加载视为将数据放入已经存在的控件。

您必须在每次回发时重新创建所有动态创建的控件。对于一个非英语母语的人来说,这是一个相当困难的阅读,但似乎真的很完整!不幸的是,我找不到关于如何使用Page_Load方法创建和更新控件的解释。我错过了相关的段落了吗?实际上它是有效的,但是因为UpdatePage是在CreateControls之后调用的,按钮文本永远不会是Button1和Button2,而是直接通过UpdatePage进行了更改。我是否需要以这种方式修改事件方法\u ClickEvent中的文本?