【发布时间】:2011-05-05 21:00:58
【问题描述】:
我需要运行另一个窗体上的按钮的代码。是否可以从不同的形式做到这一点?如果您说可以通过将其声明为 public 来实现:
- 如何将控件声明为 public?
- 如何将正确的事件传递给
button_click?它需要两个参数 - 我如何传递它们?
【问题讨论】:
标签: c# .net winforms .net-3.5 .net-4.0
我需要运行另一个窗体上的按钮的代码。是否可以从不同的形式做到这一点?如果您说可以通过将其声明为 public 来实现:
button_click?它需要两个参数 - 我如何传递它们?【问题讨论】:
标签: c# .net winforms .net-3.5 .net-4.0
可以在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...
}
祝你好运!
【讨论】:
您可以使用 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);
}
【讨论】:
在代码为 (firstForm) 的表单中,您需要将过程公开并可用于辅助按钮为 (btnMyButton) 的辅助表单。完成此操作后,您可以将辅助按钮的单击事件处理程序连接到第一种形式的代码,如下所示。
其次,如 Dustin 所述,您可以选择将此代码移动到一个单独的类中,然后简单地引用方法处理程序以及您需要的尽可能多的事件。
无论哪种方式都行,但我同意,如果您想遵循良好的设计,您应该分离关注点,因为它与业务逻辑(代码)和表示层(即带有按钮的表单)有关
//第二种形式的按钮
btnMyButton.Click += new EventHandler(firstForm.MethodThatHasCodeToRun);
希望对你有帮助,
享受吧!
【讨论】:
您可以通过更改表单设计器中的“修饰符”伪属性来公开控件。
一旦按钮是公开的,你可以通过调用 PerformClick 方法来运行它的 Click 事件,例如form1.button1.PerformClick()。您不必直接调用事件处理程序。
但是,按照 Dustin Laine 的建议创建一个公共方法可能是一个更好的主意。
【讨论】:
为什么不在click 事件都执行的共享类中创建一个公共方法。
【讨论】: