如何为动态创建的按钮创建一个onClick事件处理程序

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();

    }

这里的问题是新创建的事件处理程序没有被触发。我已经浏览了这个网站并查看了几个问题和答案,也研究了页面生命周期,它们都说动态按钮应该在Init或Pre_init上,但我的问题是当另一个按钮被点击时必须创建它,这怎么可能呢?


点击事件是否应该引起页面的回发? - Mark Broadhurst
不,它不会触发 postback @Saint - Jivan
@burning_LEGION,你在我的问题上编辑了什么?我找不到任何改进? - Jivan
基本上,您有两种解决方案来解决您的问题:您可以使页面在每次单击时重新发布,这可能不是最好的用户体验,但更容易修复;或者您可以实现JavaScript解决方案,这需要更多的工作,但您将拥有更好的产品。您想要哪一个? - Mark Broadhurst
5个回答

3

你的意思是我需要在OnInit方法中创建onclick处理程序吗?@WraithNath - Jivan
嗨,是的,您可以尝试使用页面的OnInit方法,在oninit方法中查找控件并从那里添加处理程序。您还可以尝试的另一件事是在设计师中将按钮设置为style="display:none"或visible=false,这样它就不会被渲染,但您仍然可以添加处理程序而无需查找控件(取决于它是否在网格中或只是在页面上等)。 - WraithNath

1

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

}

谢谢你的帮助,但是出现了一个错误,显示为“对象引用未设置”,我认为这是由于按钮加载时没有创建会话导致的。该如何解决?@Anand - Jivan
这不是完整的工作代码。显然,我错过了一些东西(比如我从未创建一个实例来保存按钮和文本框)。这只是指向如何做的方向指针。 - Anand

0

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

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

-1

您只需要在jQuery代码的ready状态中添加此代码,它就可以很好地处理动态按钮。

$(document).ready(function(){
   $('input#tbsearchByName').click(function(){
         // code goes here
   });
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接