使用C#开发传统的WINDOWS程序时,我在一个MDI窗口菜单下打开了一个窗口,问:
1. 如何让这个窗口只打开一个实例?现在我每点一次菜单,就开一个窗口,我用的SHOW方法。
2. 如何让程序关闭这个窗口后才能回到MDI主窗口,而不是可以在打开这个窗口的同时还可以操作菜单。

解决方案 »

  1.   

    1\可以用单件模式
    2\用ShowDialog()打开
      

  2.   

    问题一:
    MDI窗口菜单事件如下:private void menuItem1_Click(object sender, System.EventArgs e)
    {
    foreach(Form f in this.MdiChildren)
    {
    if (f.Name == "Form2")//判断打开的子窗体中是否有Form2
    return;
    } Form2 f2 = new Form2();
    f2.MdiParent = this;
    f2.Show();
    }
      

  3.   

    private  bool GetInstanceState(string Frm_Name)
    {
    int Children_Count=this.MdiChildren.Length;
    for(int i=0;i<Children_Count;i++)
    {
    if (this.MdiChildren[i].Name==Frm_Name )

    this.MdiChildren[i].WindowState=System.Windows.Forms.FormWindowState.Normal;
    this.MdiChildren[i].Focus();
                        return true;
    }
    }
    return false;
    }
    2 用ShowDialog()
      

  4.   

    问题二:
    楼主既然要实现类似于ShowDialog()模态对话框方式,那干吗又用MDI
      

  5.   

    用 ShowDialog不行,报错‘非顶级窗口不能显示为模式对话框,在调用Showdialog之前应从所有父窗体中移除该窗体’,我的代码:
    form2 fm2 = new form2();
    fm2.MdiParent = this;
    fm2.Showdialog();
      

  6.   


    把判断Form2是否已经打开的那段代码提出来写个公共方法不就行了啊
    每个菜单事件中调用方法判断一下就行了
      

  7.   

    即算是这样,用这个方法控制同一个窗口的打开也太笨了,被人看见 要被笑死!
    大家说说为什么调用showdialog()方法报那个顶级窗口的错?以前很多开发平台的Showdialog()不是用得蛮好吗?还有就是设窗口属性为response的方法等等。
    另外说一下,这个FM2是我直接创建一个form的方法创建的,不知道这里有没有问题
      

  8.   

    在PB中,如果设窗口为MDIchild,则这个窗口一定只打开一次,C#中有没有类似的功能?
      

  9.   

    1.使用单例模式    public class frmInfoDept 
        {
            private static frmInfoDept frm = null;
            private frmInfoDept()
            {
                myInfoDeptBll = new InfoDeptBLL();
                InitializeComponent();
            }
            public static MdiChildEditForm GetInstance()
            {
                if (frm == null || frm.IsDisposed == true)
                {
                    frm = new frmInfoDept();
                }
                else
                {
                    frm.Activate();
                }
                return frm;
            }
    ...
        }2.ShowDialog()
      

  10.   

    问题解决了,是我有个地方画蛇添足了,谢谢大家关心,Showdialog完全 可以满足要求