【问题标题】:How can I create a dynamic button click event on a dynamic button?如何在动态按钮上创建动态按钮单击事件?
【发布时间】:2011-09-05 11:42:02
【问题描述】:

我正在动态地在页面上创建一个按钮。现在我想在那个按钮上使用按钮点击事件。

如何在 C# ASP.NET 中做到这一点?

【问题讨论】:

    标签: c# asp.net .net button event-handling


    【解决方案1】:
    Button button = new Button();
    button.Click += (s,e) => { your code; };
    //button.Click += new EventHandler(button_Click);
    container.Controls.Add(button);
    
    //protected void button_Click (object sender, EventArgs e) { }
    

    【讨论】:

    • 您必须在 OnInit 方法中创建按钮,否则事件处理程序将不起作用
    • 首先 thnx IN this u write button.Click += (s,e) => { your code; }; s = 对象发送者和 e = 事件参数 ri8?但按钮点击事件也不会触发......你能解释一下它是如何工作的......
    • @amitvyas:这是相同代码的更短但更复杂的版本。而不是显式事件处理程序声明 - 使用 lambda 表达式和匿名方法隐式:{ this is anon method with 2 arguments declared }
    • 这对我也不起作用;事件处理程序从未触发。这可能是因为每次收到请求时都会为按钮创建一个新的事件处理程序。
    • 动态生成的事件必须在!IsPostBack之外的Page_Load/Page_Init事件中注册。
    【解决方案2】:

    对新手来说更容易:

    Button button = new Button();
    button.Click += new EventHandler(button_Click);
    
    protected void button_Click (object sender, EventArgs e)
    {
        Button button = sender as Button;
        // identify which button was clicked and perform necessary actions
    }
    

    【讨论】:

    • 什么是非新手版?
    • @MichaelMello:非新手可能是 lambda 人。 "button.click += (sender, e) => { // 在这里做点什么 }" :)
    • 我可以传递其他参数吗?即button.Click += new EventHandler(button_Click("Test"));?
    • 没关系,这行得通:button.Click += (se, ev) => button_Click(se, ev, qo);
    【解决方案3】:

    在创建按钮时只需将事件处理程序添加到按钮。

     button.Click += new EventHandler(this.button_Click);
    
    void button_Click(object sender, System.EventArgs e)
    {
    //your stuff...
    }
    

    【讨论】:

      【解决方案4】:

      这样做更容易:

      Button button = new Button();
      button.Click += delegate
      {
         // Your code
      };
      

      【讨论】:

        【解决方案5】:

        您可以通过简单的方式创建按钮,例如:

        Button button = new Button();
        button.Click += new EventHandler(button_Click);
        
        protected void button_Click (object sender, EventArgs e)
        {
            Button button = sender as Button;
            // identify which button was clicked and perform necessary actions
        }
        

        但事件可能不会触发,因为元素/元素必须在每次回发时重新创建,否则您将丢失事件处理程序。

        我尝试了这个解决方案来验证 ViewState 是否已经生成并在每次回发时重新创建元素,

        例如,假设您在单击事件时创建按钮:

            protected void Button_Click(object sender, EventArgs e)
            {
               if (Convert.ToString(ViewState["Generated"]) != "true")
                {
                    CreateDynamicElements();
                }
            
            }
        

        在回发时,例如在页面加载时,您应该这样做:

            protected void Page_Load(object sender, EventArgs e)
            {
                if (Convert.ToString(ViewState["Generated"]) == "true") {
                    CreateDynamicElements();
                }
            }
        

        在 CreateDynamicElements() 中,您可以放置​​您需要的所有元素,例如您的按钮。

        这对我来说效果很好。

        public void CreateDynamicElements(){
        
            Button button = new Button();
            button.Click += new EventHandler(button_Click);
        
        }
        

        【讨论】:

          【解决方案6】:

          假设您有 25 个对象并希望一个进程处理任何一个对象的单击事件。您可以编写 25 个委托或使用循环来处理点击事件。

          public form1()
          {
              foreach (Panel pl  in Container.Components)
              {
                  pl.Click += Panel_Click;
              }
          }
          
          private void Panel_Click(object sender, EventArgs e)
          {
              // Process the panel clicks here
              int index = Panels.FindIndex(a => a == sender);
              ...
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-05-01
            • 2014-02-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-03-25
            • 1970-01-01
            相关资源
            最近更新 更多