【问题标题】:How do I refrence form1 from form2 without causing an infinite loop?如何在不导致无限循环的情况下从 form2 引用 form1?
【发布时间】:2011-11-20 18:01:16
【问题描述】:

在我的主表单 (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 对象的调用,因此无限循环。

【问题讨论】:

  • 使用委托和事件从父到子窗体 0r 如果需要,反之亦然。

标签: c# object loops checkbox


【解决方案1】:

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

【讨论】:

  • 其实我误解了你声明的最后一行。我相信这确实回答了这个问题。谢谢。
【解决方案2】:

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

基本上你有两个表单,Form1 和 Form2,它们会在某些复选框的变化上抛出事件(OnChangeEvent?)。

Form1 监听来自 Form2 的事件,而 Form2 从 Form1 做同样的事情。

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

【讨论】:

    【解决方案3】:

    在 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_Console_Ap.Form1”不包含“ChangeCheck”的定义,并且没有扩展方法“ChangeCheck”接受“IPInformer_Console_Ap”类型的第一个参数。可以找到 Form1'(您是否缺少 using 指令或程序集引用?)
    • 我创建了一个从上面实现您的代码的新项目。我能够让项目运行,但是将 form1CheckBox 转为选中状态也不会将 form2CheckBox 转为选中状态。它们似乎仍然彼此独立运作。
    • 在我的电脑上完美运行。您是否命名了 form1 上的复选框 form1CheckBox 和 form2 上的 form2CheckBox ?此外,如果您复制/粘贴代码,请确保您进入复选框的属性并将 checkchanged 的​​事件设置为分别由 form1CheckBox_CheckedChanged 和 form2CheckBox_CheckedChanged 方法处理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-25
    相关资源
    最近更新 更多