C# 如何在不引起无限循环的情况下引用form1和form2?

C# 如何在不引起无限循环的情况下引用form1和form2?,c#,object,loops,checkbox,C#,Object,Loops,Checkbox,在我的主表单(form1)中,我有一些复选框,当选中这些复选框时,也应该选中form2中相应的复选框。我还想知道,如果选中了表单2中的复选框,它们会选中表单1中相应的复选框。我认为我遇到的问题是form1可以引用form2的对象,但是如果我在form2中实例化form1的对象,我相信它会创建一个无限循环?任何能帮助我们解决这个问题的人都将不胜感激 Form1创建form2的对象: Form2 formSettings = new Form2(); 现在,当我有活动时,我可以更新form

在我的主表单(form1)中,我有一些复选框,当选中这些复选框时,也应该选中form2中相应的复选框。我还想知道,如果选中了表单2中的复选框,它们会选中表单1中相应的复选框。我认为我遇到的问题是form1可以引用form2的对象,但是如果我在form2中实例化form1的对象,我相信它会创建一个无限循环?任何能帮助我们解决这个问题的人都将不胜感激

Form1创建form2的对象:

    Form2 formSettings = new Form2();
现在,当我有活动时,我可以更新form2:

      public void logScanResultsToolStripMenuItem_Click(object sender, EventArgs e)
    {
        if (logScanResultsToolStripMenuItem.Checked)
        {
            formSettings.chbxLogScanResults.Checked = true;

        }
        else
        {
            formSettings.chbxLogScanResults.Checked = false;

        }        
    }         
但如果我尝试在表格2中做类似的事情:

   Form1 form1 = new Form1();

为了能够从form2(formSettings)中引用form1的菜单项,我最终创建了一个对象(form1),该对象调用form1的对象,在form1中包括创建form2对象的调用,从而形成一个无休止的循环。

您不应该每次勾选复选框时都创建一个实例。您需要保持实例处于活动状态,并根据需要隐藏/显示它们。另外,其中一个表单的构造函数应该接收另一个表单作为其构造函数中的参数,以便它们可以相互引用。

希望这足够清楚。这不是一个直截了当的答案,因为你的问题中确实没有太多细节

基本上,您有两个表单,Form1和Form2,它们将在更改某些复选框时抛出事件(OnChangeEvent?)

Form1侦听来自Form2的事件,Form2也从Form1执行相同的操作


如果Form1的事件侦听接收到OnChangeEvent并更改其复选框,则它应该引发OnChangeEvent。另一方面,如果它没有更改其复选框(因为它已经有了正确的值),那么它不应该引发OnChangeEvent。

在Form1的主体中,您需要声明Form2来保存它的实例以供引用并打开它。当您从Form1调用Form2.Show方法时,您会将其自身的引用传递给Form2,然后可以使用该引用获得对Form1的访问权

public partial class Form1 : Form
{
    Form2 form2 = new Form2();

    public Form1()
    {
        InitializeComponent();
    }

    private void form1Button_Click(object sender, EventArgs e)
    {
        form2.Show(this);
    }

    private void form1CheckBox_CheckedChanged(object sender, EventArgs e)
    {
        form2.ChangeCheck(form1CheckBox.Checked);
    }

    public void ChangeCheck(bool isItChecked)
    {
        form1CheckBox.Checked = isItChecked;
    }
}
在Form2中,您现在可以引用Form1作为所有者

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }

    private void form2CheckBox_CheckedChanged(object sender, EventArgs e)
    {
        ((Form1)this.Owner).ChangeCheck(form2CheckBox.Checked);
    }

    public void ChangeCheck(bool isItChecked)
    {
        form2CheckBox.Checked = isItChecked;
    }
}

如果需要,使用父窗体到子窗体的委托和事件,反之亦然。尝试实现此解决方案,但收到以下错误:错误1“IPInformer\u Console\u Ap.Form1”不包含“ChangeCheck”的定义,并且找不到接受“IPInformer\u Console\u Ap.Form1”类型的第一个参数的扩展方法“ChangeCheck”(是否缺少using指令或程序集引用?)我创建了一个新项目来实现上面的代码。我可以让项目运行,但是将form1CheckBox设置为选中并不能将form2CheckBox设置为选中。它们似乎彼此独立运行。在我的计算机上运行得非常好。您是否将复选框命名为form1上的form1CheckBox和f上的form2CheckBoxorm2?此外,如果复制/粘贴代码,请确保进入复选框的属性,并将checkedchanged事件设置为分别由form1CheckBox_checkedchanged和form2CheckBox_checkedchanged方法处理。实际上,我误解了您语句的最后一行。我相信这确实回答了问题斯蒂恩,谢谢。