繁体   English   中英

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

[英]Troubles with dynamic c# asp.net controls update

我目前正在使用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知道。

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

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

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

将OnInit视为“将页面上的所有控件放入页面并连接事件处理程序”。

将Page_Load视为“将数据放入已经存在的控件中”。

暂无
暂无

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

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