【问题标题】:C# - How to make two forms reference each otherC# - 如何使两个表单相互引用
【发布时间】:2011-09-01 17:09:19
【问题描述】:

我正在用 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;
    }
}
}

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;
    }
}
}

【问题讨论】:

  • 你应该为你的控件命名。
  • Form1 和 Form2 构造函数在无限循环中互相调用。

标签: c# winforms


【解决方案1】:

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;
    }
}
}

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

Form1 需要调整为

public Form1()
{
    InitializeComponent();
    frm2 = new Form2(this);
}

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

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;
    }
}
}

【讨论】:

  • 感谢您的详细回复。我决定选择第一个选项。
【解决方案2】:

需要将“其他形式”提供给适当的实例。这样的事情应该会有所帮助。

public partial class TogglingForm : Form
{
    TogglingForm Other {get; set;}
    public TogglingForm()
    {
        InitializeComponent();
    }        

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

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

....


static void Main()
{
   var first = new TogglingForm();
   var second = new TogglingForm {Other = first};
   first.Other = second;

   first.Show();
}   

【讨论】:

    【解决方案3】:

    在创建另一个表单时,您正在为每个表单创建一个新实例。

    相反,您应该让其中一个表单将其父表单的实例作为参数。

    【讨论】:

      【解决方案4】:

      当您在 frm1 对象上创建 Form2 的实例时,这个新实例会创建另一个 Form1 实例,该实例会创建一个新的 Form 2 实例,...

      你看到无限循环了吗?

      在主类上或作为全局应用程序变量创建彼此的一个实例。或者将它们作为参数传递给彼此。 .NET 框架只会引用它们而不分配新的内存空间。

      【讨论】:

        【解决方案5】:
        namespace WindowsFormsApplication1 
        { 
        public partial class Form2 : Form 
        { 
            Form1 frm1; 
            public Form2(Form1 frm1) 
            { 
                InitializeComponent(); 
                this.frm1 = frm1; 
            } 
        
            private void button1_Click(object sender, EventArgs e) 
            { 
                frm1.Visible = false; 
            } 
        
            private void button2_Click(object sender, EventArgs e) 
            { 
                frm1.Visible = true; 
            } 
        } 
        } 
        

        【讨论】:

          【解决方案6】:
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-02-19
          • 1970-01-01
          • 2016-08-13
          • 1970-01-01
          • 1970-01-01
          • 2019-08-01
          • 1970-01-01
          相关资源
          最近更新 更多