如何从form2引用form1而不会导致无限循环?

时间:2011-09-20 03:52:49

标签: c# object loops checkbox

在我的主窗体(form1)中,我有复选框,选中时还应检查form2中的相应框。我还想要检查form2中的复选框,检查form1上的相应框。我相信我遇到的问题是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;

        }        
    }         

但如果我尝试在Form2中做类似的事情:

   Form1 form1 = new Form1();

因此我可以从form2(formSettings)中引用form1的菜单项。我最终创建一个对象(form1),该对象调用Form1的一个对象,Form1中的对象包含一个调用来创建Form2的对象,因此无尽的循环。

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

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

基本上你有两种形式,Form1和Form2,它们会在更改某些复选框时抛出事件(OnChangeEvent?)。

Form1侦听Form2中的事件,Form2从Form1中执行相同的操作。

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

答案 2 :(得分:0)

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