C# 以编程方式创建按钮时不会激发事件

C# 以编程方式创建按钮时不会激发事件,c#,asp.net,c#-4.0,C#,Asp.net,C# 4.0,我正在使用事件处理程序动态创建一个按钮。但事件并未发生。请帮我做这个。我的部分代码在这里 Button btn = new Button(); btn.ID = "btn" + i; btn.Text = "Add New"; Panel1.Controls.Add(btn); btn.Click += new EventHandler(this.GreetingBtn_Click); Panel1.Controls.Add(new LiteralControl("<br /&

我正在使用事件处理程序动态创建一个按钮。但事件并未发生。请帮我做这个。我的部分代码在这里

 Button btn = new Button();
 btn.ID = "btn" + i;
 btn.Text = "Add New";
 Panel1.Controls.Add(btn);
 btn.Click += new EventHandler(this.GreetingBtn_Click);
 Panel1.Controls.Add(new LiteralControl("<br /><br />"));

  void GreetingBtn_Click(Object sender, EventArgs e)
  {
     create();
  }
按钮btn=新按钮();
btn.ID=“btn”+i;
btn.Text=“添加新”;
面板1.控件。添加(btn);
btn.Click+=新建事件处理程序(此.GreetingBtn\u单击);
Panel1.Controls.Add(新的LiteralControl(“

”); 无效问候点击(对象发送者,事件参数e) { 创建(); }

我想在单击按钮时访问create()函数。

在不太了解代码的情况下,我猜您不是在ASP.NET的相应阶段创建控件

您需要的是PreInit,如下所述:

在开始阶段完成后和初始化阶段开始前引发。 将此事件用于以下操作:

创建或重新创建动态控件


Move
btn.Click+=neweventhandler(this.GreetingBtn\u Click)上排一级,即添加到父级之前,并尝试路由事件

Button btn = new Button();
 btn.ID = "btn" + i;
 btn.Text = "Add New";
btn.Click += new RoutedEventHandler(this.GreetingBtn_Click);
 Panel1.Controls.Add(btn);
 Panel1.Controls.Add(new LiteralControl("<br /><br />"));

  void GreetingBtn_Click(Object sender, RoutedEventArgs e)
  {
     create();
  }
按钮btn=新按钮();
btn.ID=“btn”+i;
btn.Text=“添加新”;
btn.Click+=新建路由EventHandler(此.GreetingBtn\u单击);
面板1.控件。添加(btn);
Panel1.Controls.Add(新的LiteralControl(“

”); 无效问候点击(对象发送者,路由目标) { 创建(); }
如果要在页面加载时添加此动态按钮,请确保其处于

if (!IsPostBack)
{
//add button here
}

始终将创建一次性控件的代码放在侧面
!iPostBack
,因为它们不需要一次又一次地创建

if (!IsPostBack)
{
   //Your code should be their enter code here
}
List myControls=new List();
受保护的无效页面加载(对象发送方、事件参数e)
{
如果(!IsPostBack)
{
myControls=新列表();
ViewState[“myControls”]=myControls;
}
}
受保护的void覆盖void LoadViewState(对象savedState)
{
base.LoadViewState(savedState);
myControls=(列表)ViewState[“myControls”];
foreach(myControls中的字符串controlID){
//创建按钮的方法位于此处。
创建按钮(controlID);
}
}
公共无效创建按钮(字符串btnID){
按钮btn=新按钮();
btn.ID=btnID;
btn.Text=“添加新”;
btn.Click+=新建路由EventHandler(此.GreetingBtn\u单击);
面板1.控件。添加(btn);
Panel1.Controls.Add(新的LiteralControl(“

”); } 无效问候点击(对象发送者,路由目标){ 创建(); }
试试这段代码。在asp.net中动态添加控件时,必须在回发中重新创建控件。最简单的方法是使用viewstate,如上所示


不正确执行此操作的常见迹象是:单击控件时,控件消失,或者事件根本不触发。希望这对别人有帮助

在哪个页面事件中创建按钮?我已修改了答案:尝试路由事件而不是经典事件。
List<string> myControls = new List<string>();

protected void Page_Load(object sender, EventArgs e)
{
     if(!IsPostBack)
     {
          myControls = new List<string>();
          ViewState["myControls"] = myControls;
     }
}

protected void override void LoadViewState(object savedState)
{
     base.LoadViewState(savedState);
     myControls = (List<string>)ViewState["myControls"];

     foreach(string controlID in myControls){
          //method to create your buttons goes here.
          createButtons(controlID);
     }
}

public void createButtons(string btnID){
     Button btn = new Button();
     btn.ID = btnID;
     btn.Text = "Add New";
     btn.Click += new RoutedEventHandler(this.GreetingBtn_Click);
     Panel1.Controls.Add(btn);
     Panel1.Controls.Add(new LiteralControl("<br /><br />"));
}

void GreetingBtn_Click(Object sender, RoutedEventArgs e){
     create();
}