【问题标题】:How to create an onClick eventHandler for a dynamically created button如何为动态创建的按钮创建 onClick eventHandler
【发布时间】:2012-08-10 10:57:37
【问题描述】:

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

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 上,但我的问题是我必须在单击另一个按钮时创建它,怎么可能?

【问题讨论】:

  • 点击事件是否会导致页面回发?
  • 不,它不会得到回发@Saint
  • @burning_LEGION,你对我的问题做了什么编辑?我找不到任何改进?
  • 所以基本上你有 2 个解决你的问题的方法,你可以让它在每次点击时回发页面,这可能不是最好的用户体验,但更容易修复,或者你可以实现javascript 解决方案会更有效,但您将拥有更好的产品。你要哪个?

标签: c# asp.net visual-studio-2010 button


【解决方案1】:

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

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

也可以在这里查看:

Dynamically added ASP.NET button click handler being ignored

这里: asp.net dynamically button with event handler

这里: asp:Button Click event not being fired

(都给出了类似的建议)

【讨论】:

  • 你的意思是我必须在 OnInit 方法上创建 onclick 处理程序吗? @WraithNath
  • 您好,是的,您可以尝试您正在使用的页面的 OnInit 方法,您可以尝试在 oninit 方法中找到控件并从那里添加处理程序。您可以尝试的另一件事是在设计器中有按钮,但使用 style="display:none" 或 visible=false 这样它不会被渲染,但您仍然可以添加处理程序而无需找到控件(依赖于无论是在网格中还是仅在页面上等)
【解决方案2】:

试试这个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";

【讨论】:

    【解决方案3】:

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

    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
    • 那不是完整的工作代码。显然有些事情我错过了(就像我从未创建过一个列表实例来保存按钮和文本框)。它只是一个指示如何做的指针。
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        猜你喜欢
        • 2014-05-21
        • 1970-01-01
        • 2016-06-29
        • 2018-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-24
        相关资源
        最近更新 更多