在我的主窗体(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的对象,因此无尽的循环。
答案 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;
}
}