刚入手C#发现mdi窗体没法像VB那样:
我在View里有显示一个窗口的菜单
现在是我想象VB那样,关闭该窗口后通过点那个菜单显示。当然要和VB效果一样了即:打开之后的窗口内容应该还在,而不是通过新建窗口实现,如我的窗口中有个listview关闭之前已经记录了数据。请赐教,谢谢!

解决方案 »

  1.   

    假设Form1是MDI父窗口
    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();
                }
            }
      

  2.   

    你好,谢谢你的答复。
    但我测试不成功,按你的思路我重写了FormClosing事件,之前是成功的,但带来了另外一个问题,那就是在该窗口打开的情况下,如果我想直接关掉程序,即直接关闭父窗口,则就无法直接关掉了,需要两次才行,有没有更好的方法,谢谢!
      

  3.   

    说明一下,我之前测试没有用你的if (e.CloseReason == CloseReason.UserClosing)
    这个判断,我想用你这个判断应该没有问题,但现在我用另一台电脑按你的,打开关闭之后再点就没有看到窗口了,我两个电脑用的都是VS2008TeamSuit
      

  4.   

    Form2代码: 
    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();
      }
    不知道是不是你要的效果
      

  5.   

    经过测试楼上的是我想要的效果,最主要是//base.Dispose(disposing);//这句注释掉,关闭的时候不释放资源 
    不过将这句应用于二楼的则是子窗口无法关闭
      

  6.   

    补充一下,二楼的方法今天在另一台电脑上是可行的!
    关键在于
                if (e.CloseReason == CloseReason.UserClosing)
                {
                    e.Cancel = true;
                    this.Hide();
                }
    不用这个也是//base.Dispose(disposing);//简单测了一下也是可行,
    但估计用了更好吧,
    谢谢两位了!!!!!