我正在尝试从与创建表单不同的表单中调用按钮。我有两种形式的申请:
从“主”表单中调用“第二”表单,其代码为:
Second run_second_form = new Second();
run_second_form.Show();
在“主”表单上,我有一个按钮“ Button1”。是否可以从“第二个”表单中调用此按钮?
我可以使用以下代码从创建它的“主”表单中轻松调用“ Button1”:
Button1.PerformClick();
但是我无法从“第二”表格中进行操作。我尝试过:
Main.Button1.PerformClick();
但是它显示“名称“ Button1”在当前上下文中不存在”。
答案 0 :(得分:4)
其他形式的按钮1不可见,因为它的修饰符不是公共的或内部的,但这无论如何都不是您想要的方式。
我要让第二个表单触发一个事件,让第一个表单对第二个表单的实例具有一个事件处理程序。
这样,两种形式之间就不会产生双向依赖性。
这是一个例子:
事件类:
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!
}
答案 1 :(得分:2)
因此,第一件事是,当使用设计器将控件添加到表单时,控件将添加为“私有”。为了使控件在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
的事件。
答案 2 :(得分:0)
好吧,首先,您可能希望将逻辑从按钮单击事件移到它自己的方法中。 其次,您实际上只需要将引用从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