新手的低级问题,C# winform 程序,vs2008。MDI窗口,已开启了一个窗口form1,点菜单栏上的按钮,要开启另一个窗口form2,同时关闭form1。问:
1.如何关闭form1,没办法直接form1.close(),会提示说form1不存在。
2.如果不是关闭form1,而是form1.hide(),那怎么才能再让form1显示出来,直接show的话跟问题1一样,提示form1不存在。
3.如何获取MDI窗体的当前活动子窗口的名称呢?
4.如何遍历MDI窗体已打开的全部子窗口,以便找到指定名称的那个子窗体。
5.如何防止重复开启新的子窗体?

解决方案 »

  1.   


    new System.Threading.Thread((System.Threading.ThreadStart)delegate  
    {   
        Application.Run(new Form());   
    }).Start();   
    this.Close(); 
      

  2.   

    有必要这么复杂么 
    一个Application.Forms[FormName]就解决了 
      

  3.   

    可能是我没有说清楚,winform程序,VS2008环境,新手,请尽量说的细些,谢谢啦MDI程序,已开启了一个子窗口form1,这时按个菜单栏上的按钮,form1关闭,form2打开,现在问题是我能打开form2,但关不了form1。以下是菜单按钮的代码private void menu_balanceset_Click(object sender, EventArgs e)
            {
                //以下开启新的窗口form2
                formset form2 = new formset();
                form2.MdiParent = this;
                form2.Show();  
                //怎么关闭form1呢。                          
            }我在这里如何关闭form1呢,
      

  4.   

    这个不太妥当吧,如果都覆盖的话,来回倒几次,不就出来成百上千的窗口,虽然看不见,不过总归是存在的吧,我想要的功能很难实现吗,貌似VB.net的打开关闭比较简单,不过我这个程序必须用C#来搞,烦。
      

  5.   

    不可以的
     FormCustomerInformation formCustomerInformation = null;
            private void 客户基本信息ToolStripMenuItem_Click(object sender, EventArgs e)
            {
                if (formCustomerInformation == null)
                {
                    formCustomerInformation = new FormCustomerInformation();
                    formCustomerInformation.MdiParent = this;
                    formCustomerInformation.WindowState = FormWindowState.Maximized;
                    formCustomerInformation.Show();            }
                else
                {
                    if (formCustomerInformation.IsDisposed)
                    {
                        formCustomerInformation = new FormCustomerInformation();
                    }
                    formCustomerInformation.MdiParent = this;
                    formCustomerInformation.WindowState = FormWindowState.Maximized;
                    formCustomerInformation.Show();
                    formCustomerInformation.Focus();
                }
      

  6.   

    这个是获取当前子窗体~
    private void toolStripButton_shuaxin_Click(object sender, EventArgs e)
            {
                if (this.ActiveMdiChild != null) //判断是否有子窗体
                {
                    if (this.ActiveMdiChild == formCustomerInformation) //有
                    {
                        formCustomerInformation.shuaxindgv();// 子窗体事件调用                }
                }
                else
                {
                    return;
                }
            }
    我估计你要的是这个
      

  7.   

    6种方法使MDI父窗体调用子窗体(子窗体同时只能显示一个) 
    1种方法使MDI父窗体调用子窗体(子窗体同时只能显示一个) 
    有一个MDI窗体叫MainForm,多个子窗体,如Form1,Form2…… 要使子窗体同时只能显示一个,那么方法1 dim Form1 as new form1 Form1.showDialog() 此方法一个MDI窗体同时只能显示一个, 方法2 在每一个子窗体的应用单态设计模式 在每一个子窗体上声明 private sub new() end sub Public Shared NewMe…… MDI窗体调用时 dim form1 as form1=form1.NewME form1.show() 这种方法每一个子窗体都要应用单态,代码重复多,不好
    方法3 是方法2的改良先写一个ChildForm继承Form 在窗体上声明 private sub new() end sub Public Shared NewMe…… 再把所有的子窗体继承它 MDI窗体调用时 dim form1 as form1=form1.NewME form1.show() 这种方法很好,代码也少
    方法4 利用MDI窗体的Controls属性循环检测当是否以存在所需子窗体存在则 .show .Activate 不存在则new了再.show 
    方法5 在MDI窗体上     Dim Form1 as form1     Friend Sub ShowForm1()                 If Form1 Is Nothing OrElse Form1.IsDisposed Then                     Form1 = New Form1                     Form1.MdiParent = Me                 End If                                Form1.Show()                 Form1.Activate()       End Sub 这种方法的缺点,每一个子窗体都要写一个这样的方法
    方法6 利用泛型改良方法5 先写一个ChildFormManager类 ''' <summary> ''' 调用子窗口 ''' </summary> ''' <typeparam name="T"></typeparam> ''' <res></res> Public Class ChildFormManager(Of T As {Form, New})     Public Shared Sub show(ByVal myform As T,  ByVal Mdi As Form)                 If myform Is Nothing OrElse myform.IsDisposed Then                     myform = New T                     myform.MdiParent = Mdi                 End If                 myform.Show()                 myform.Activate()     End Sub End Class 在MDI窗体中这样调用 dim Form1 as Form1 form1=ChildFormManager(of Form1).show(form1,Me)
    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sanwaxubin/archive/2008/06/21/2572453.aspx
    结贴给分  呵呵
      

  8.   

    楼上的宝贝儿,真想狠狠的亲你一口啊,
    this.ActiveMdiChild.close()  搞定收工,其实我的意思还是没有表述清楚哈,我要做个MDI程序,但同一时间只允许一个子窗口的程序。还有个疑问哈,使用this.ActiveMdiChild.close() 是完全关闭了当前子窗口。如果我用this.ActiveMdiChild.hide()的话,当前窗口form1被隐藏,如果我再次点按钮把form1显示出来,这个时候又会执行new,然后才.show(),那么这个时候show出来的form1还是前面被hide()的那个form1吗,还是说前面那个form1还在隐藏着,第二次又new了一个实例出来了??就是两个form1??糊里糊涂ing。 
      

  9.   

    打开FORM1时你做下判断吗?
    if(form1!=null)
    {
    //do something
    }
      

  10.   

                foreach (Form item in Application.OpenForms)
                {
                    if (item != this)
                    {
                        item.Hide();
                    }
                }    隐藏本窗体外的所有窗体