winform双窗口切换的有关问题

winform双窗口切换的问题。
本帖最后由 cjdxhc 于 2015-01-10 16:07:32 编辑

//Form1
        /// <summary>
        /// 下一级窗口
        /// </summary>
        private Form frm;

        public Form Frm
        {
            get { return frm; }
            set { frm = value; }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.Hide();
            if (this.Frm == null)
            {
                Form2 f = new Form2();
                f.Frm = this;
                this.Frm = f;
                f.ShowDialog();
            }
            else
            {
                this.Frm.ShowDialog();
            }
        }

//Form2
        /// <summary>
        /// 上一级窗口
        /// </summary>
        private Form frm;

        public Form Frm
        {
            get { return frm; }
            set { frm = value; }
        }

        private void Form2_FormClosing(object sender, FormClosingEventArgs e)
        {
            this.Hide();
            this.frm.ShowDialog();
        }


基本功能
Form1的按钮可以打开Form2,此时,Form1隐藏,Form2以模式对话框的形式打开。
在Form2关闭的时候,Form2隐藏,Form1又以模式对话框的形式打开。
因为两个窗体上还带有文本框,所以填写的东西希望保存,因此创建了窗体属性,把Form1和Form2之间互存。
这样窗体上的变化都可以保留。

问题
现在的情况是重复操作几次关和开之后,提示“已进行模式显示的窗体不能显示为模式对话框。请在调用 showDialog 之前关闭该窗体。”的错误。
如果将Form2的this.frm.Show();,这样的话,Form1打开时候又不出发Form_Load事件。导致无法更新内容。
请问有什么方法可以解决吗?
------解决思路----------------------
不要隐藏,直接关闭,再打开重新new,这样就不需要模式窗体了
------解决思路----------------------
否则你在form1里打开form2,又在form2里打开form1,然后又在form1里打开form2.....
这等于是无限递归,总有堆栈溢出的时候
------解决思路----------------------
showdialog与show的不同点:
showdialog会阻塞代码的执行,等窗体关闭了才继续执行后续的代码,因此show出来的窗体也是无法将焦点重新切换回父窗体,除非关闭
那么你两个窗口不断重复执行showdialog,每一次代码都阻塞住,并保持状态等待子窗体关闭后继续执行,而子窗体其实永远不关闭只是不断的show,不断的隐藏,这就是递归,而不是循环.
------解决思路----------------------
引用:
Quote: 引用:

否则你在form1里打开form2,又在form2里打开form1,然后又在form1里打开form2.....
这等于是无限递归,总有堆栈溢出的时候


我没有无限递归。
我的代码意思是,启动Form1后,通过Form1上的按钮打开Form2。此时把Form1指向Form2的属性Frm。这样Form2就可以操作Form1的控件。同理Form1上也保存了Form1,Form2指向了Form1的属性Frm。

其实,自始至终就只有Form1和Form2两个对象。只是对他们的属性进行了设置。
并没有无限递归。我仔细观察过内存,没有增加。

如果new的话,窗体的属性没有保存。

你这就是无限递归.不要看内存不增加就以为没有递归.
比如以下代码:
void function()
{
function();
}
函数里不声明任何变量,那么内存当然也并不增加,消耗的是程序指针的堆栈,而不是变量声明的堆栈,一运行,内部指针就溢出了

你想保存窗体的状态,应该使用一些全局变量来保存,或者如果你的程序是一共就只有2个窗体的单机程序,声明成静态窗体,里面放静态变量,也行.或者你就是想让窗体显示时执行一个事件函数,不是还有Shown吗,没必要非纠结Load啊
------解决思路----------------------
总之只是实现2个窗口切换,保持关闭前的状态,并且显示时自动执行一个函数
这办法多的是,不要老靠拍脑袋想方案
------解决思路----------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:

Form1的代码
Form2 f2 = null;
        private void button1_Click(object sender, EventArgs e)
        {
            if (f2 == null) f2 = new Form2();
            this.Hide();
            f2.Show();
        }

Form2的代码
Form1 f1 = null;
        private void button1_Click(object sender, EventArgs e)
        {
            if (f1 == null) f1 = new Form1();
            this.Hide();
            f1.Show();
        }

这个只实现了基本的切换,里面的逻辑自己加吧


如果非要实现ShowDialog呢?

没有意义啊,那个窗体都隐藏了,还ShowDialog干嘛


Show不会重新执行FormLoad事件。
ShowDialog会重新执行FormLoad事件。

直接代码调用Load事件 哈哈winform双窗口切换的有关问题