刚入手C#发现mdi窗体没法像VB那样:
我在View里有显示一个窗口的菜单
现在是我想象VB那样,关闭该窗口后通过点那个菜单显示。当然要和VB效果一样了即:打开之后的窗口内容应该还在,而不是通过新建窗口实现,如我的窗口中有个listview关闭之前已经记录了数据。请赐教,谢谢!
我在View里有显示一个窗口的菜单
现在是我想象VB那样,关闭该窗口后通过点那个菜单显示。当然要和VB效果一样了即:打开之后的窗口内容应该还在,而不是通过新建窗口实现,如我的窗口中有个listview关闭之前已经记录了数据。请赐教,谢谢!
Form2是MDI子窗口
做如下更改
Form1的代码 public partial class Form1 : Form
{
private Form2 f = new Form2();
public Form1()
{
InitializeComponent();
f.MdiParent = this;
} private void form2ToolStripMenuItem_Click(object sender, EventArgs e)
{
f.Show();
}
}Form2的代码 public Form2()
{
InitializeComponent();
} private void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
if (e.CloseReason == CloseReason.UserClosing)
{
e.Cancel = true;
this.Hide();
}
}
但我测试不成功,按你的思路我重写了FormClosing事件,之前是成功的,但带来了另外一个问题,那就是在该窗口打开的情况下,如果我想直接关掉程序,即直接关闭父窗口,则就无法直接关掉了,需要两次才行,有没有更好的方法,谢谢!
这个判断,我想用你这个判断应该没有问题,但现在我用另一台电脑按你的,打开关闭之后再点就没有看到窗口了,我两个电脑用的都是VS2008TeamSuit
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private static Form2 _instance;
public static Form2 Instance()
{
if (_instance == null)
_instance = new Form2();
else
_instance.Activate();
return _instance;
} private void Form2_Load(object sender, EventArgs e)
{
} protected override void OnClosed(EventArgs e)
{
_instance.Hide(); }
}Form2的Designer的代码中
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
//base.Dispose(disposing);//这句注释掉,关闭的时候不释放资源
}
父窗口:
private void form1ToolStripMenuItem_Click(object sender, EventArgs e)
{
Form2 frm =Form2.Instance();
frm.MdiParent = this;
frm.Show();
}
不知道是不是你要的效果
不过将这句应用于二楼的则是子窗口无法关闭
关键在于
if (e.CloseReason == CloseReason.UserClosing)
{
e.Cancel = true;
this.Hide();
}
不用这个也是//base.Dispose(disposing);//简单测了一下也是可行,
但估计用了更好吧,
谢谢两位了!!!!!