4

目前,我正在为学生宿舍做一个项目,现在我必须实现一些关于学生的搜索策略。这里我必须在用户单击 .aspx 页面中的另一个服务器按钮时动态创建一个按钮,因此我必须创建新创建按钮的 onclick 事件处理程序。我使用的代码片段是:

protected void btnsearchByName_Click(object sender, EventArgs e)
    {
        TextBox tbsearchByName = new TextBox();
        Button btnsearchName = new Button();
        tbsearchByName.Width = 250;
        tbsearchByName.ID = "tbsearchByName";
        tbsearchByName.Text = "Enter the full name of a student";
        btnsearchName.ID = "btnsearchName";
        btnsearchName.Text = "Search";
        btnsearchName.Click += new EventHandler(this.btnsearchName_Click);

        pnlsearchStudents.Controls.Add(tbsearchByName);
        pnlsearchStudents.Controls.Add(btnsearchName);
    }
     protected void btnsearchName_Click(object sender, EventArgs e)
    {
        lblsearch.Text = "btnsearchName_Click event fired in " + DateTime.Now.ToString();

    }

在这里,问题是新创建的 eventHandler 没有被触发。我浏览了这个网站,查看了几个问题和答案,还浏览了页面生命周期,他们都说动态按钮应该在 Init 或 Pre_init 上,但我的问题是我必须在单击另一个按钮时创建它,怎么可能?

4

5 回答 5

3

您需要在每次回发时为按钮添加点击处理程序。

您可以在页面加载时的搜索学生面板中查找按钮,或尝试页面 OnInit() 方法在创建处理程序时添加处理程序。

还要在这里检查:

动态添加的 ASP.NET 按钮单击处理程序被忽略

在这里: 带有事件处理程序的asp.net动态按钮

在这里: asp:Button Click 事件没有被触发

(所有这些都给出了类似的建议)

于 2012-08-10T11:00:09.493 回答
1

试试这个http://msdn.microsoft.com/ru-ru/library/system.web.ui.webcontrols.button.command(v=vs.90).aspx

btnsearchName.Command += new CommandEventHandler(this.btnsearchName_Click);

btnsearchName.CommandName = "Click";

于 2012-08-10T11:13:37.493 回答
0

您每次都需要重新创建按钮并附加事件处理程序。为此,创建一个按钮列表并将其保存在会话中。在页面加载时,每次都浏览列表并创建按钮

public Button create_button()
{
        btnsearchName.ID = "btnsearchName";
        btnsearchName.Text = "Search";
        btnsearchName.Click += new EventHandler(this.btnsearchName_Click);

       return btnsearchName;
 }

 public TextBox create_textbox()
 {
      TextBox tbsearchByName = new TextBox();
        Button btnsearchName = new Button();
        tbsearchByName.Width = 250;
        tbsearchByName.ID = "tbsearchByName";
        tbsearchByName.Text = "Enter the full name of a student";
        return tbsearchByName;
 }


protected void btnsearchByName_Click(object sender, EventArgs e)
{
    TextBox tbsearchByName = create_textbox();
    Button btnsearchName = create_button();
    //add to panels
    pnlsearchStudents.Controls.Add(tbsearchByName);
    pnlsearchStudents.Controls.Add(btnsearchName);

   //add to session
   List<Button> lstbutton = Session["btn"] as List<Button>
   lstbutton.add(btnsearchName);
   //similarly add textbox

  //again add to session
  Session["btn"] = lstbutton 
}

public override page_load(object sender, eventargs e)
{
   //fetch from session, the lstButton and TextBox and recreate them
   List<Button> lstbutton = Session["btn"] as List<Button>;
   foreach(Button b in lstbutton)
       pnlsearchStudents.Controls.Add(b);

   //similar for textbox

}
于 2012-08-10T11:07:21.850 回答
0

我不确定,但可能你必须像这样覆盖 OnInit() 方法。

 protected override void OnInit(EventArgs e)
 {
    base.OnInit(e);
 } 
于 2012-08-10T11:16:37.603 回答
-1

您只需在 jquery 代码的就绪状态添加此代码,它也适用于动态按钮

$(document).ready(function(){
   $('input#tbsearchByName').click(function(){
         // code goes here
   });
});
于 2012-08-10T11:04:15.870 回答