C# - 如何使两个表单相互引用

and*_*l85 4 c# winforms

我在MS Visual C#中编写了一个WindowsForms应用程序,我需要两种形式才能相互引用.在我测试时,我在Form1上创建了两个按钮 - 一个按钮显示Form2,另一个按钮隐藏它(代码在下面).

我想对Form2做同样的事情 - 创建隐藏或显示Form1的两个按钮.我使用了与Form1相同的方法,但是当我编译应用程序时,似乎陷入无限循环并且我收到了StackOverflow消息.

如何更改代码以便两个表单能够互相引用?

Form1代码:

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
    Form2 frm2;
    public Form1()
    {
        InitializeComponent();
        frm2 = new Form2();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        frm2.Visible = false;
    }

    private void button2_Click(object sender, EventArgs e)
    {
        frm2.Visible = true;
    }
}
}
Run Code Online (Sandbox Code Playgroud)

Form2代码:

namespace WindowsFormsApplication1
{
public partial class Form2 : Form
{
    Form1 frm1;
    public Form2()
    {
        InitializeComponent();
        frm1 = new Form1();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        frm1.Visible = false;
    }

    private void button2_Click(object sender, EventArgs e)
    {
        frm1.Visible = true;
    }
}
}
Run Code Online (Sandbox Code Playgroud)

Sco*_*ain 5

Forms2的代码应该是

namespace WindowsFormsApplication1
{
public partial class Form2 : Form
{
    Form1 frm1;
    public Form2(Form1 parent)
    {
        InitializeComponent();
        frm1 = parent;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        frm1.Visible = false;
    }

    private void button2_Click(object sender, EventArgs e)
    {
        frm1.Visible = true;
    }
}
}
Run Code Online (Sandbox Code Playgroud)

即使两者互相交谈,也必须首先创建一个并传递给第二个.

Form1需要进行调整

public Form1()
{
    InitializeComponent();
    frm2 = new Form2(this);
}
Run Code Online (Sandbox Code Playgroud)

另一种方法是创建两个并在构造后传递它

namespace WindowsFormsApplication1
{
public class SomewhereElse
{
    public void SomeFunction()
    {
         Form1 form1= new Form1();
         Form2 form2= new Form2();

         form1.frm2 = form2;
         form2.frm1 = form1;
    }
}

public partial class Form2 : Form
{
    public Form1 frm1 {get; set;}
    public Form2(Form1 parent)
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        frm1.Visible = false;
    }

    private void button2_Click(object sender, EventArgs e)
    {
        frm1.Visible = true;
    }
}

public partial class Form1 : Form
{
    public Form2 frm2 {get; set;}
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        frm2.Visible = false;
    }

    private void button2_Click(object sender, EventArgs e)
    {
        frm2.Visible = true;
    }
}
}
Run Code Online (Sandbox Code Playgroud)