我首先设置了主窗体的ISMDIContainer属性为true,我想启动的时候很多窗体就是它的子窗体
目前用代码for (int k = 0; k < this.MdiChildren.Length; k++)查找子窗体时,发现this.MdiChildren.Length=0,没有子窗体

解决方案 »

  1.   

    form.MdiParent = 父窗体,其他窗体实例化的时候设置啊
      

  2.   

    要在主窗体Load事件里先把所有的子窗体都实例化一次吗?要一个个这样敲一次吗?有没有什么办法循环窗体为子窗体?
      

  3.   


    这样下去,在里面不是有一大串代码?
    Form1 form1 = new Form1();
    Form1 form1 = new Form1();
    Form1 form1 = new Form1();
      

  4.   


     //show MDIchild
            public void ShowChild(string childFullName)
            {
                if (!IsExist(childFullName))
                {
                    Type type = Type.GetType(childFullName);
                    if (type != null)
                    {
                        object obj = Activator.CreateInstance(type);
                        Form child = (Form)obj;
                        child.MdiParent = this;
                        child.Dock = DockStyle.Fill;
                        child.Show();
                        childFormList.Add(child);
                    }
                }
                else
                {
                    Form existForm = childFormList.Find(form => (form.GetType().ToString() == childFullName));
                    existForm.Activate();
                }
            }
            // if child has been created
            public bool IsExist(string childFullName)
            {
                foreach (Form f in childFormList)
                {
                    if (f.GetType().ToString() == childFullName)
                        return true;
                }
                return false;
            }
      

  5.   

    写在父窗体里,每次只需要调用ShowChild,参数为子窗体类文件名
      

  6.   

    childFormList未定义,另外我的按钮里面只要写ShowChild()就可以了吗?
      

  7.   

    首先理解子窗体是什么和主窗体的关系是什么?
    从程序结构来说,他们是没有关系的.
    如果非要把它们扯上关系,在主窗体打开一个窗体,如果它是自己的子窗体就放到MDI容器里.1.主窗体不知道它有多少子窗体.
    2.子窗体只不过它的有个属性是主窗体而已.你想得动态得到子窗体只有一种方式,就是反射,获取所有Form,如果form中PrentForm是"主窗体",实例化它并Show
      

  8.   

    看变量名你应该知道这是一个自定义的list啊,而且还是存放Form用的
      

  9.   

    首先用窗体名(类名)来动态创建窗体并打开,用反射.
    其次,已经创建的窗体再次创建时进行判断,是单例.
     FormList是全局记录子窗体状态的
      

  10.   

    看变量名你应该知道这是一个自定义的list啊,而且还是存放Form用的
    老大,能不能给一个做好的例子传上来?折腾了几天了实在不行,网上找的都是打开新窗体,而不是打开已有窗体。
    目前是这样一个项目(菜单是变化的,但是项目里有各个窗体的Name与按钮对应的):
    MDI窗体中有个Treeview做的菜单,有两个Node:按钮一、按钮二
    窗体一:Form1.Name="测试一"
    窗体二:Form1.Name="测试二"我希望的是通过这个Treeview的菜单来打开关闭或切换窗体(是现有做好的窗体),但同一个窗体只能打开一次。
      

  11.   

    看变量名你应该知道这是一个自定义的list啊,而且还是存放Form用的用c#2010折腾了很多天了,网上也转了很多,还是有各种各样的小问题没有解决,你可不可以帮我帮一个例子传上来学习?
      

  12.   

    子窗体是在运行时设定的:
    childForm.MdiParent = mainForm;
    childForm.Show();
      

  13.   

    http://www.sufeinet.com/thread-2984-1-1.html这个可以用,不知道为什么到我的上面就不行了
      

  14.   


    我的是以一个TreeView做为菜单,动态加载,6楼大哥那个childFormList定义我实在不知道在哪定义,更不知道要Using哪个引用,所以没办法用上。using System.Reflection;namespace WindowsForms
    {
        public partial class MDIBOX : Form
        {
            public MDIBOX()
            {
                InitializeComponent();
            }        private void TOOLS_AfterSelect(object sender, TreeViewEventArgs e)
            {
                if (this.TOOLS.SelectedNode.Text != null)
                {
                    CreateForm("WindowsForms." + this.TOOLS.SelectedNode.Name, "WindowsForms", this);//这里注意到了"WindowsForms"就是工程中开始的namespace 后面的词(我菜鸟,不知道专业名词叫什么)。
                }
            }
            public static void CreateForm(string strName, string namespaceName, Form MdiParentForm)//当初就是这几个参数搞不明白
            {
                int Index = strName.LastIndexOf(".");
                string formName = strName.Substring(Index + 1);
                if (!ShowChildForm(formName, MdiParentForm))
                {
                    string path = namespaceName;
                    string name = strName;
                    Form fr = (Form)Assembly.Load(path).CreateInstance(name);
                    fr.MdiParent = MdiParentForm;
                    //下面是定义子窗体的属性
                    fr.Width = 1040;
                    fr.Height = 695;
                    fr.FormBorderStyle = FormBorderStyle.FixedToolWindow;
                    fr.StartPosition = FormStartPosition.Manual;
                    fr.Show();
                }
            }        public static bool ShowChildForm(string childFormText, Form parentForm)
            {
                bool bl = false;
                //听说for循环效率低,高手都会用foreach,因为我不懂,所以还是用了for
                for (int i = 0; i < parentForm.MdiChildren.Length; i++)
                {
                    if (parentForm.MdiChildren[i].Name == childFormText)
                    {
                        //这里用的是Visible而不是Show或者BringToFront,是因为那样达不到再次显示被隐藏的窗体的目的。
                        parentForm.MdiChildren[i].Visible = true;
                        bl = true;
                    }
                    else
                    {
                        parentForm.MdiChildren[i].Visible = false;
                    }
                }
                return bl;
            }
        }
    }另外在加载Treeview的时候发现提示里几个参数第一个是Key实则是属性里面的name,
    即Add(name,Text,选择前的图标,选择后的图标),图标之前要与ImageList关联
    TOOLS为TreeView控件名,MDIIcon为ImageList控件名this.TOOLS.ImageList = this.MDIIcon;
    TreeNode nodeParent;
    for (int i = 0; i < Program.Tools.Count; i = i + 3)
        {
            nodeParent = this.TOOLS.Nodes.Add(Program.Tools[i + 1].ToString(), Program.Tools[i].ToString(), "T1", "T2");
         }
      

  15.   

    我在上面都说了,那个list是一个自己定义的列表,具体要你自己定义,如
    List<From> childFormList=new List<Form>();
    childFormList.Add(new 窗体1());
    .....
    你肯定有一个保存所有子窗体的集合,才能去操作他们么
      

  16.   

    我正是因为不知道List<From> childFormList=new List<Form>();关键的这一点,不知道要Using哪一个东东
    这种问题对于学这些的大哥大姐肯定知道,我是现学现用的菜鸟,很多人讨论的时候都不见带上这么句using xxxxx