从C#

时间:2018-07-08 23:17:48

标签: c# winforms button

我正在尝试从与创建表单不同的表单中调用按钮。我有两种形式的申请:

  • 主要
  • 第二

从“主”表单中调用“第二”表单,其代码为:

Second run_second_form = new Second();
run_second_form.Show();

在“主”表单上,我有一个按钮“ Button1”。是否可以从“第二个”表单中调用此按钮?

我可以使用以下代码从创建它的“主”表单中轻松调用“ Button1”:

Button1.PerformClick();

但是我无法从“第二”表格中进行操作。我尝试过:

Main.Button1.PerformClick();

但是它显示“名称“ Button1”在当前上下文中不存在”。

3 个答案:

答案 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的之外可以访问,您需要更改可访问性。

Accessibility

将其从“私人”更改为“内部”(如果两种形式在同一程序集中,则为首选),如果不是,则为“公共”。

然后,您应该可以访问主窗体上的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