【问题标题】:Is it possible to trigger a click event from another form?是否可以从另一个表单触发点击事件?
【发布时间】:2011-05-05 21:00:58
【问题描述】:

我需要运行另一个窗体上的按钮的代码。是否可以从不同的形式做到这一点?如果您说可以通过将其声明为 public 来实现:

  1. 如何将控件声明为 public?
  2. 如何将正确的事件传递给button_click?它需要两个参数 - 我如何传递它们?

【问题讨论】:

    标签: c# .net winforms .net-3.5 .net-4.0


    【解决方案1】:

    可以在Formpublic中做一个控件,但不推荐,你可以这样做:

    1)在第一个表单(form1)ButtonFirstFormClicked中声明一个新事件

    public event EventHandler ButtonFirstFormClicked;
    

    并在 Button.Click 事件处理程序中触发此事件

    void button_Clicked(object sender, EventArgs e)
    {
    
        // if you're working with c# 6.0 or greater
        ButtonFirstFormClicked?.Invoke(sender, e);
    
        // if you're not then comment the above method and uncomment the below
        //if (ButtonFirstFormClicked!= null)
        //     ButtonFirstFormClicked(sender, e);
    }  
    

    2)在第二种形式(form2)中订阅事件

    form1.ButtonFirstFormClicked += (s, e)
    {
     // put your code here...
    } 
    

    祝你好运!

    【讨论】:

    • 所以您将代码放在 Form1 之外?很抱歉,您的解释很难理解。哪个表格调用哪个?
    • 很抱歉投了反对票,但您的解决方案尚不清楚
    【解决方案2】:

    您可以使用 internal 作为修饰符,这样您就可以轻松访问点击事件。

    例如,您在 form1 中有一个点击事件。 而不是将其设为私有、公开或受保护。把它作为内部这样 您可以轻松访问其他类中的方法。但是internal 修饰符只能在 当前包。

    Form1

    internal passobj;
    internal passeargs;
    
    internal void button1_Click(object obj, EventArgs e)
    {
     this.passobj = obj;
     this.passeargs = e;
    
     MessageBox.Show("Clicked!")
    }
    

    Form2

    private void button1_Click(object obj, EventArgs e)
    {
    
       Form1 f1 = new Form1();
       f1.button1_Click(f1.passobj, f1.passeargs);
    }
    

    【讨论】:

    • 你能举个例子吗
    • 见我上面的编辑,我已经做了好几次了,我认为使用内部修饰符是安全的。我认为您也可以使用 public 修饰符来做到这一点。
    【解决方案3】:

    在代码为 (firstForm) 的表单中,您需要将过程公开并可用于辅助按钮为 (btnMyButton) 的辅助表单。完成此操作后,您可以将辅助按钮的单击事件处理程序连接到第一种形式的代码,如下所示。

    其次,如 Dustin 所述,您可以选择将此代码移动到一个单独的类中,然后简单地引用方法处理程序以及您需要的尽可能多的事件。

    无论哪种方式都行,但我同意,如果您想遵循良好的设计,您应该分离关注点,因为它与业务逻辑(代码)和表示层(即带有按钮的表单)有关

    //第二种形式的按钮

    btnMyButton.Click += new EventHandler(firstForm.MethodThatHasCodeToRun);
    

    希望对你有帮助,

    享受吧!

    【讨论】:

      【解决方案4】:
      1. 您可以通过更改表单设计器中的“修饰符”伪属性来公开控件。

      2. 一旦按钮是公开的,你可以通过调用 PerformClick 方法来运行它的 Click 事件,例如form1.button1.PerformClick()。您不必直接调用事件处理程序。

      但是,按照 Dustin Laine 的建议创建一个公共方法可能是一个更好的主意。

      【讨论】:

        【解决方案5】:

        为什么不在click 事件都执行的共享类中创建一个公共方法。

        【讨论】:

        • +1 以获得良好的设计建议。无论如何,应该在事件处理程序中调用另一个事件(尽管输入的验证不会受到伤害,但即使是在事件处理程序调用的其他方法中也可以。)
        • 我非常尊重您,因为与您这样的其他豪赌客不同,他们会标记自己的答案,这样他们就不会有否定的答案
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-23
        • 2016-02-22
        • 2021-12-21
        相关资源
        最近更新 更多