【问题标题】:How to call a button click event from another method如何从另一个方法调用按钮单击事件
【发布时间】:2020-05-09 07:41:09
【问题描述】:

如何通过其他方法调用SubGraphButton_Click(object sender, RoutedEventArgs args)

private void SubGraphButton_Click(object sender, RoutedEventArgs args)
{
}

private void ChildNode_Click(object sender, RoutedEventArgs args)
{
   // call SubGraphButton-Click().
}

【问题讨论】:

    标签: c#


    【解决方案1】:

    您可以通过以下代码轻松做到这一点(假设您的按钮名称是 btnButton):

    btnButton.PerformClick();
    

    【讨论】:

    • 我以前总是使用这个,但是在遇到很多问题之后,我认为选择的答案是一个更安全的方法。
    • @Pedram 无意打扰您,如果按钮未启用且不可见,它只是按钮的 PerformClick() 方法不会触发,我制作的大多数表单我通常启用和禁用按钮,因此我遇到了问题。
    • @Burgo855 感谢您的反馈!所以这取决于调用的类型或你想在哪里使用它。一般来说,它确实调用了按钮。而且,请确保所有想法都在这里得到赞赏,没有人会因为你分享你的想法而感到不安:)
    • 如果它位于会创建交叉线程的内部,这并不总是有效。这是解决该问题的技巧。可能会帮助其他人: this.Invoke((MethodInvoker)delegate () { btnButton.PerformClick(); });
    • 我想知道为什么我花了 2 个小时尝试我的方式,但没有找到这个答案 XD
    【解决方案2】:

    您可以通过简单地将参数传递给 button_click 事件来调用它:

    private void SubGraphButton_Click(object sender, RoutedEventArgs args)
    {
    }
    
    private void ChildNode_Click(object sender, RoutedEventArgs args)
    {
       SubGraphButton_Click(sender, args);
    }
    

    【讨论】:

    • 如果SubGraphButton_Click()async 怎么办?而需要模拟点击的方法不是吗?这不是正确答案。正确的答案是在ChildNode_Click() 内调用SubGraphButton.PerformClick()
    • 可能在调用前加上“await”
    • 对于任何想要在活动之外执行此操作的人,我通过创建自定义发送者和参数来管理:object sender = this;RoutedEventArgs args。然后像往常一样调用它:SubGraphButton_Click(sender, args);
    【解决方案3】:

    你可以通过传递来调用button_click事件..

    private void SubGraphButton_Click(object sender, RoutedEventArgs args)
    {
    }
    
    private void ChildNode_Click(object sender, RoutedEventArgs args)
    {
       SubGraphButton_Click(sender, args);
    }
    

    也没有通过..

    private void SubGraphButton_Click(object sender, EventArgs args)
    {
    }
    
    private void Some_Method() //this method is called
    {
       SubGraphButton_Click(new object(), new EventArgs());
    }
    

    【讨论】:

      【解决方案4】:

      您可以执行不同的方法来解决此问题。最好的方法是,如果你的两个按钮都假设做同样的工作,你可以定义第三个函数来完成这项工作。例如:

      private void SubGraphButton_Click(object sender, RoutedEventArgs args)
      {
          myJob()  
      }
      
      private void ChildNode_Click(object sender, RoutedEventArgs args)
      {
          myJob()
      }
      
      private void myJob()
      {
          // Your code here
      }
      

      但如果你仍然坚持按照自己的方式去做,最好的做法是:

      private void SubGraphButton_Click(object sender, RoutedEventArgs args)
      {
      }
      
      private void ChildNode_Click(object sender, RoutedEventArgs args)
      {
         SubGraphButton_Click.PerformClick();
      }
      

      【讨论】:

        【解决方案5】:

        通常更好的方法是触发事件(点击)而不是直接调用方法。

        【讨论】:

        • 如果您添加一个示例代码段来说明您的意思,您的答案将会得到改善。
        【解决方案6】:

        在 WPF 中,您可以通过这种方式轻松完成:

        this.button.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));
        

        【讨论】:

          【解决方案7】:
          private void PictureBox1_Click(object sender, EventArgs e)
          {
              MessageBox.Show("Click Succes");
          }
          
          private void TextBox1_KeyPress(object sender, KeyPressEventArgs e)
          {
              if (e.KeyChar == 13)
              {
                  PictureBox1_Click(sender, e); //or try this one "this.PictureBox1_Click(sender, AcceptButton);"
              }
          }
          

          【讨论】:

            【解决方案8】:

            你可以简单地称呼它:

            SubGraphButton_Click(sender, args);
            

            现在,如果您的 SubGraphButton_Click 对 args 做了什么,您可能会遇到麻烦,但通常您不会对它们做任何事情。

            【讨论】:

              【解决方案9】:

              对我来说,这在 WPF 中有效

                  private void Window_KeyDown(object sender, KeyEventArgs e)
                  {
                      if (e.Key == Key.Enter)
                      {
                          RoutedEventArgs routedEventArgs = new RoutedEventArgs(ButtonBase.ClickEvent, Button_OK);
                          Button_OK.RaiseEvent(routedEventArgs);
                      }
                  }
              

              【讨论】:

                【解决方案10】:

                使用 InvokeOnClick 事件。即使按钮不可见/禁用它也可以工作

                【讨论】:

                  【解决方案11】:

                  从任何地方调用它的简单方法就是使用“null”和“RoutedEventArgs.Empty”,如下所示:

                  SubGraphButton_Click(null, RoutedEventArgs.Empty);
                  

                  【讨论】:

                    【解决方案12】:

                    将其添加到 Click 委托的实例中:

                    ChildNode.Click += SubGraphButton_Click

                    这与 .NET 事件遵循的模式(观察者)保持一致。

                    【讨论】:

                      【解决方案13】:

                      对于想知道的人来说,这也适用于按钮单击。 例如:

                      private void btn_Click(object sender, EventArgs e)
                              {
                                  MessageBox.Show("Test")
                              }
                      
                      private void txb_KeyPress(object sender, KeyPressEventArgs e)
                              {
                                  if (e.KeyChar == (char)13)
                                  {
                                      btn_Click(sender, e);
                                  }
                      

                      在这种情况下,当在 textfield(txb) 中按 Enter 时,它将单击激活 MessageBox 的按钮。

                      【讨论】:

                        【解决方案14】:

                        我们在这个项目中有 2 个表格。 主要形式变化

                        private void button1_Click(object sender, EventArgs e) { // work }

                        public void button1_Click(object sender, EventArgs e) { // work }

                        以及其他形式,当我们需要上述功能时

                                private void button2_Click(object sender, EventArgs e)
                            {
                                main_page() obj = new main_page();
                                obj.button2_Click(sender, e);
                            }
                        

                        【讨论】:

                        • 感谢您分享答案。但是,它混淆了它起作用的原因。在您的情况下,您需要公开事件处理程序。这是需要将两个参数传递给第一个方法的不同解决方案。
                        【解决方案15】:

                        对于 WPF:

                        YourButtonName.RaiseEvent(new RoutedEventArgs(System.Windows.Controls.Primitives.ButtonBase.ClickEvent));
                        

                        【讨论】:

                          猜你喜欢
                          • 1970-01-01
                          • 2013-10-13
                          • 1970-01-01
                          • 2014-06-28
                          • 1970-01-01
                          • 2011-04-03
                          • 2019-01-10
                          • 1970-01-01
                          • 2014-04-24
                          相关资源
                          最近更新 更多