在一个mainform中有两个按钮,并且是一个多文档窗体,在这个mainform窗体中有两个childrenform窗体,当按button1时调用一个childrenform1窗体,当按button2时,调用另一个childrenform2窗体;两个不同的窗体可以同时存在,但是相同的窗体只能是一个,该怎样用代码写这个程序????

解决方案 »

  1.   

    窗体有一个活动Activate()方法,但是要判断当前有没有打开同样的窗体,还要能够循环调用……
      

  2.   

    以下是我的做法:
    有两个窗体一个form1和form2
    再是form1中的代码,也就是主窗体的代码,点击按钮事件在这里 public Form2 form2 = null;
            private void button1_Click(object sender, EventArgs e)
            {
                if (form2 == null)
                {
                    form2 = new Form2(this);
                    form2.Show();
                }
                else
                {
                    form2.Focus();
                }
            }
    在form2中的代码如下 Form1 form1 = null;
            public Form2(Form1 form)
            {
                InitializeComponent();
                form1 = form;
            }
     private void Form2_FormClosed(object sender, FormClosedEventArgs e)
            {
                if (form1 != null)
                {
                    form1.form2 = null;
                }
            }就这个样子就可以实现了,我实现了!不过我总觉得这样搞怪怪的!希望高人解决
      

  3.   

    你想的是"同一个窗体,永远只能打开一个"吧? 
    这个简单,用单对象模式就行了.方法是把Form的构造方法改成 private,然后公开一个CreateForm的方法,在该方法中返回唯一的窗体. 以下伪代码仅供示意:
    public partial class Form2 : Form
        {
            static Form2 frmOnlyForm;//静态的
            private Form2()//私有的构造器
            {
                InitializeComponent();
            }        //利用此静态方法创建唯一窗体,如果窗体已经new了,就返回该窗体,否则重新创建一个.
            public static Form CreateForm() {
                if (frmOnlyForm == null) {
                    frmOnlyForm = new Form2();
                }
                return frmOnlyForm;
            }
      

  4.   

    //遍历主窗口上的所有子菜单
                for (int i = 0; i < this.MdiChildren.Length; i++)
                {
                    //如果所点的窗口被打开则重新激活
                    if (this.MdiChildren[i].Tag.ToString().ToLower() == formName.ToLower())
                    {
                        this.MdiChildren[i].BringToFront();
                        //this.MdiChildren[i].Show();
                        if (this.MdiChildren[i].WindowState == FormWindowState.Maximized)
                        {
                            //   this.MdiChildren[i].WindowState = FormWindowState.Maximized;
                        }
                        flag = true;
                        break;
                    }
                }
                if (!flag)
                {
                    //如果不存在则用反射创建form窗体实例。
                    Assembly asm = Assembly.Load("MasterDB");//程序集名
                    object frmObj = asm.CreateInstance("MasterDB." + formName);//程序集+form的类名。
      

  5.   

    窗体只是一个对象,任何时候,只有一个对象存在,
    第一次调用 CreateForm()方法的时候,肯定会new 窗体, 以后都是直接返回之前创建的窗体对象. 
    ....直到把窗体关闭,引用消失.
      

  6.   

    单击按钮调用的时候:
    什么不管,直接写:(示意伪代码)
    private void btnOpenForm2(objcet sender,EventArgs e)
    {
      Form2 = Form2.CreateForm();
      From2.ShowDialog();
    }
      

  7.   

    你的意思是不是不可以出现两个form1或者两个form2,但是可以同时出现一个form1和一个form2
      

  8.   

    不是,只能出现一个form1或者是一个form2,也可以是form1和form2同时存在
    也就是说,如果是同样的窗体的话只能出现一个,而不同的窗体可以同时出现……
      

  9.   

    public Form1 Form1 = new Form1();
    public Form2 Form2 = new Form2();
    private void button1_Click(object sender, EventArgs e)
    {
        if (!Form1.IsHandleCreated)
        {
            Form1.Show();
        }
    }
    private void button2_Click(object sender, EventArgs e)
    {
        if (!Form2.IsHandleCreated)
        {
            Form2.Show();
        }
    }
      

  10.   


    这样就好了,还可以解决你窗体关闭后重新打开的问题。代码只表示大致的思想。public Form1 form1;private void button1_Click(object sender, EventArgs e)
    {   
        if ( form1 == null || form1.IsDisposed )
        {
             form1 = new Form1 ();
        }    form1.Show();
    }Form2 同上。