winform双窗口切换的有关问题
winform双窗口切换的问题。
基本功能
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,不断的隐藏,这就是递归,而不是循环.
------解决思路----------------------
你这就是无限递归.不要看内存不增加就以为没有递归.
比如以下代码:
void function()
{
function();
}
函数里不声明任何变量,那么内存当然也并不增加,消耗的是程序指针的堆栈,而不是变量声明的堆栈,一运行,内部指针就溢出了
你想保存窗体的状态,应该使用一些全局变量来保存,或者如果你的程序是一共就只有2个窗体的单机程序,声明成静态窗体,里面放静态变量,也行.或者你就是想让窗体显示时执行一个事件函数,不是还有Shown吗,没必要非纠结Load啊
------解决思路----------------------
总之只是实现2个窗口切换,保持关闭前的状态,并且显示时自动执行一个函数
这办法多的是,不要老靠拍脑袋想方案
------解决思路----------------------
直接代码调用Load事件 哈哈
//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,不断的隐藏,这就是递归,而不是循环.
------解决思路----------------------
你这就是无限递归.不要看内存不增加就以为没有递归.
比如以下代码:
void function()
{
function();
}
函数里不声明任何变量,那么内存当然也并不增加,消耗的是程序指针的堆栈,而不是变量声明的堆栈,一运行,内部指针就溢出了
你想保存窗体的状态,应该使用一些全局变量来保存,或者如果你的程序是一共就只有2个窗体的单机程序,声明成静态窗体,里面放静态变量,也行.或者你就是想让窗体显示时执行一个事件函数,不是还有Shown吗,没必要非纠结Load啊
------解决思路----------------------
总之只是实现2个窗口切换,保持关闭前的状态,并且显示时自动执行一个函数
这办法多的是,不要老靠拍脑袋想方案
------解决思路----------------------
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事件 哈哈