C# 动态c asp.net控件更新的问题
我目前正在使用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
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中的文本?