C#winform中,MdiParent中每个子窗口都只能打开一个

时间:2023-02-20 23:32:26
我现在就是在父窗口中,可以同时打开同一个子窗口很多次,每按一次总是弹出一个。
如何让子窗体只能同时打开一个而不是多个?

16 个解决方案

#1


bool bOpen = false;
            foreach (Form frmOpen in this.MdiChildren)
            {
                if (frmOpen.Name == frmForm1.Name)
                {
                    frmOpen.Activate();
                    frmOpen.WindowState = FormWindowState.Maximized;
                    bOpen = true;
                    break;
                }
            }
            if (bOpen == false)
            {
                frmForm1.MdiParent = this;
                frmForm1.Show();
                frmForm1.WindowState = FormWindowState.Maximized;
            }

#2


楼上的方法很好!以前也都是这样处理的!

#3


不赞同1L 还要循环

#4


系统设置_Click:

if (this.ActiveMdiChild == null)
{
     XXX X=new XXX();X.Show();
}
else
{
     MessageBox.Show("只能打开一个", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
}

#5



private void button1_Click(object sender, EventArgs e)
{
    foreach (Form frm in this.MdiChildren)
    {
        if (frm.GetType().Name == "Form2") { frm.BringToFront(); return; }
    }
    Form2 frm2 = new Form2();
    frm2.MdiParent = this;
    frm2.Show();
}

#6


用一个List保存所有打开的窗口的名字

List<string> listForm = new List<string>();
            //每次打开窗体前检查
            if (listForm.Contains("Form1"))
            {
                MessageBox.Show("Form1窗体已经打了");
                return;
            }
            else
            {
                Form f = new Form();
                f.Name = "";
                listForm.Add(f.Name);
                f.Show();
            }

#7


问一下,这些代码要写在父窗口的 哪个事件中啊?还是建个类放在里面?

#8


Form2 frm2 = new Form2();
frm2.MdiParent = this;
frm2.Show();

你原来MDI主窗口中执行上面代码的位置
用下面代码替换

foreach (Form frm in this.MdiChildren)
{
    if (frm.GetType().Name == "Form2") { frm.BringToFront(); return; }
}
Form2 frm2 = new Form2();
frm2.MdiParent = this;
frm2.Show();

#9


楼主,你搞错了,你定义了局部变量所以每点一次就实例化一个,也就是 xx a=new xx();所以为了你可以每次只能点一个窗口出来,你可以在方法外面定义一个xx a=new xx();然后在方法里面写a.show();还有一个办法是不要a.show(),而是a.shoudialog();

#10


为什么我有的子窗体设置成初始化时是最大,但是有的没有初始化最大,当打开时还是变成最大啊?

#11


foreach(form frm in MDICHILDFORM)
{
if(frm is Form1)
frm.active();
else
{
Form1 frm1=new form1();
frm1.show();
}
}
好象可以的

#12


忘写这行了

frm1.MdiParent = this;

#13


1楼就可以啊,弄那么复杂干嘛?
6楼用一个List保存打开的窗口,不麻烦吗?这样每次关闭窗口的时候还要从List中移除打开的窗口,个人觉得麻烦。1楼的方法简单可行!

#14


9楼的方法最好用       赞一个    

#15


正遇到这个问题。看看~~

#16


如何打开新的子窗口自动关闭旧的子窗口呢?

#1


bool bOpen = false;
            foreach (Form frmOpen in this.MdiChildren)
            {
                if (frmOpen.Name == frmForm1.Name)
                {
                    frmOpen.Activate();
                    frmOpen.WindowState = FormWindowState.Maximized;
                    bOpen = true;
                    break;
                }
            }
            if (bOpen == false)
            {
                frmForm1.MdiParent = this;
                frmForm1.Show();
                frmForm1.WindowState = FormWindowState.Maximized;
            }

#2


楼上的方法很好!以前也都是这样处理的!

#3


不赞同1L 还要循环

#4


系统设置_Click:

if (this.ActiveMdiChild == null)
{
     XXX X=new XXX();X.Show();
}
else
{
     MessageBox.Show("只能打开一个", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
}

#5



private void button1_Click(object sender, EventArgs e)
{
    foreach (Form frm in this.MdiChildren)
    {
        if (frm.GetType().Name == "Form2") { frm.BringToFront(); return; }
    }
    Form2 frm2 = new Form2();
    frm2.MdiParent = this;
    frm2.Show();
}

#6


用一个List保存所有打开的窗口的名字

List<string> listForm = new List<string>();
            //每次打开窗体前检查
            if (listForm.Contains("Form1"))
            {
                MessageBox.Show("Form1窗体已经打了");
                return;
            }
            else
            {
                Form f = new Form();
                f.Name = "";
                listForm.Add(f.Name);
                f.Show();
            }

#7


问一下,这些代码要写在父窗口的 哪个事件中啊?还是建个类放在里面?

#8


Form2 frm2 = new Form2();
frm2.MdiParent = this;
frm2.Show();

你原来MDI主窗口中执行上面代码的位置
用下面代码替换

foreach (Form frm in this.MdiChildren)
{
    if (frm.GetType().Name == "Form2") { frm.BringToFront(); return; }
}
Form2 frm2 = new Form2();
frm2.MdiParent = this;
frm2.Show();

#9


楼主,你搞错了,你定义了局部变量所以每点一次就实例化一个,也就是 xx a=new xx();所以为了你可以每次只能点一个窗口出来,你可以在方法外面定义一个xx a=new xx();然后在方法里面写a.show();还有一个办法是不要a.show(),而是a.shoudialog();

#10


为什么我有的子窗体设置成初始化时是最大,但是有的没有初始化最大,当打开时还是变成最大啊?

#11


foreach(form frm in MDICHILDFORM)
{
if(frm is Form1)
frm.active();
else
{
Form1 frm1=new form1();
frm1.show();
}
}
好象可以的

#12


忘写这行了

frm1.MdiParent = this;

#13


1楼就可以啊,弄那么复杂干嘛?
6楼用一个List保存打开的窗口,不麻烦吗?这样每次关闭窗口的时候还要从List中移除打开的窗口,个人觉得麻烦。1楼的方法简单可行!

#14


9楼的方法最好用       赞一个    

#15


正遇到这个问题。看看~~

#16


如何打开新的子窗口自动关闭旧的子窗口呢?