能否从另一个表单触发点击事件?

11

我需要运行另一个表单上的按钮代码,从不同的表单中是否可能执行?如果您说通过声明它为公共,则:

  1. 如何声明公共控件?
  2. 如何传递正确的事件到 button_click? 它需要两个参数-我如何传递它们?
5个回答

17
为什么不在共享类中创建一个公共方法,使得两个click事件都可以执行该方法。

1
好的设计建议加1分。在事件处理程序中,除了调用另一个事件之外,不应该有任何其他内容(尽管验证输入也不会有害,但即使是这样,也可以在事件处理程序调用的另一个方法中完成)。 - David
1
我非常尊重你,因为与其他像你一样的高手不同,他们会抬高自己的答案,以避免负面评价。 - Alex Gordon

7

可以在Form中将控件设置为public,但不建议这样做,您可以采取以下步骤:

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之外?很抱歉,但是你的解释很难理解。哪个表单调用了哪个? - KansaiRobot
抱歉给您点了个踩,但是您的解决方案并不清楚。 - abdou_dev

3

你可以使用internal关键字作为修饰符,这样你就可以轻松地访问点击事件。

例如,在Form1中有一个点击事件。不要将其设置为私有的、公共的或受保护的,而是将其设置为internal。这样,你就可以在其他类中轻松地访问该方法。但是,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);
}

请给我一个例子。 - Alex Gordon
请看我的编辑,我已经多次这样做了,我认为使用 internal 修饰符是安全的。我认为你也可以使用 public 修饰符来实现。 - Rye

1
在代码所在的表单(firstForm)中,您需要将过程公开并提供给包含第二个按钮(btnMyButton)的辅助表单。完成此操作后,您可以将辅助按钮的单击事件处理程序与第一表单中的代码连接起来,如下所示。
其次,正如Dustin所述,您可以选择将此代码移动到一个单独的类中,然后只需引用方法处理程序,就可以使用任意数量的事件。
无论哪种方式都可以,但我认为如果您想遵循良好的设计原则,应该对业务逻辑(代码)和表示层(即带有按钮的表单)进行关注分离。
//第二张表单中的按钮
btnMyButton.Click += new EventHandler(firstForm.MethodThatHasCodeToRun);

希望这能有所帮助,
祝愉快!

1
  1. 您可以通过在窗体设计器中更改“Modifiers”伪属性将控件设置为公共。

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

但是,像Dustin Laine所建议的那样创建一个公共方法可能是更好的选择。


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