[英]Invoke button from another Form in C#
我试图从与创建表单不同的表单调用按钮。 我有两种形式的申请:
“第二”表单是通过“主”表单中的代码调用的:
Second run_second_form = new Second();
run_second_form.Show();
在“主”表单上,我有一个按钮“ Button1”。 是否可以从“第二个”表单中调用此按钮?
我可以使用以下代码从创建它的“主”表单中轻松调用“ Button1”:
Button1.PerformClick();
但我无法通过“第二”表格进行操作。 我尝试过:
Main.Button1.PerformClick();
但显示“名称” Button1”在当前上下文中不存在”。
Button1在其他窗体中不可见,因为它的修饰符不是公共的或内部的,但这无论如何都不是您想要的方式。
我会让第二个表单触发一个事件,让第一个表单对第二个表单的实例具有一个事件处理程序。
这样,两种形式之间就不会产生双向依赖性。
这是一个例子:
活动类别:
public class ActionToCallEvent : EventArgs
{
private ActionToCallEvent() {}
}
在表格2中:
public static event EventHandler<ActionToCallEvent> ActionToCall;
private static void OnActionToCall(EventArgs e)
{
if (ActionToCall != null)
ActionToCall(this, e);
}
需要使用1中的方法时,将在Form2中调用OnActionToCall。
在Form 1中,当实例化Form2实例时:
Form2 form2 = new Form2();
form2.ActionToCall += Form2EventHandler;
这是Form1中捕获事件处理的方法:
private void Form2EventHandler(object sender, ActionToCallEvent e)
{
// Call Your Code Here!
}
因此,第一件事是,当使用设计器将控件添加到表单时,控件将添加为“私有”。 为了使控件在Main
之外可以访问,您需要更改可访问性。
将其从“专用”更改为“内部”(如果两种形式在同一程序集中,则为首选);如果不是,则将其更改为“公共”。
然后,您应该能够访问主窗体上的Button1
控件。
您唯一没有显示的是如何保留对Main
的引用以能够调用Main.Button1.PerformClick()
。
在设计器中更改了可访问性之后,这是我用来测试此代码的代码:
public partial class Second : Form
{
public Second()
{
InitializeComponent();
}
internal Main Main { get; set; }
private void button1_Click(object sender, EventArgs e)
{
if (this.Main != null)
{
this.Main.Button1.PerformClick();
}
}
}
public partial class Main : Form
{
public Main()
{
InitializeComponent();
}
private void Main_Load(object sender, EventArgs e)
{
Second run_second_form = new Second();
run_second_form.Main = this;
run_second_form.Show();
}
private void Button1_Click(object sender, EventArgs e)
{
MessageBox.Show("Clicked on Main");
}
}
那对我有用。
综上所述,我认为Ctznkane525的解决方案可能是您所需的更好解决方案。 通常最好避免像这样传递对表单的引用。 Main
应该只响应Second
的事件。
好吧,首先,您可能希望将逻辑从按钮单击事件移到它自己的方法中。 其次,您实际上只需要将引用从Main表单传递给Second表单。
有一些选择。
Second run_second_form = new Second();
run_second_form.Show(this); //Makes the main form the owner of second_form
然后以第二种形式
Mainform mainForm = (MainForm)this.Owner;
mainform.Button1.PreformClick
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.