我首先设置了主窗体的ISMDIContainer属性为true,我想启动的时候很多窗体就是它的子窗体
目前用代码for (int k = 0; k < this.MdiChildren.Length; k++)查找子窗体时,发现this.MdiChildren.Length=0,没有子窗体
目前用代码for (int k = 0; k < this.MdiChildren.Length; k++)查找子窗体时,发现this.MdiChildren.Length=0,没有子窗体
调试欢乐多
这样下去,在里面不是有一大串代码?
Form1 form1 = new Form1();
Form1 form1 = new Form1();
Form1 form1 = new Form1();
//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;
}
从程序结构来说,他们是没有关系的.
如果非要把它们扯上关系,在主窗体打开一个窗体,如果它是自己的子窗体就放到MDI容器里.1.主窗体不知道它有多少子窗体.
2.子窗体只不过它的有个属性是主窗体而已.你想得动态得到子窗体只有一种方式,就是反射,获取所有Form,如果form中PrentForm是"主窗体",实例化它并Show
其次,已经创建的窗体再次创建时进行判断,是单例.
FormList是全局记录子窗体状态的
老大,能不能给一个做好的例子传上来?折腾了几天了实在不行,网上找的都是打开新窗体,而不是打开已有窗体。
目前是这样一个项目(菜单是变化的,但是项目里有各个窗体的Name与按钮对应的):
MDI窗体中有个Treeview做的菜单,有两个Node:按钮一、按钮二
窗体一:Form1.Name="测试一"
窗体二:Form1.Name="测试二"我希望的是通过这个Treeview的菜单来打开关闭或切换窗体(是现有做好的窗体),但同一个窗体只能打开一次。
childForm.MdiParent = mainForm;
childForm.Show();
我的是以一个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");
}
List<From> childFormList=new List<Form>();
childFormList.Add(new 窗体1());
.....
你肯定有一个保存所有子窗体的集合,才能去操作他们么
这种问题对于学这些的大哥大姐肯定知道,我是现学现用的菜鸟,很多人讨论的时候都不见带上这么句using xxxxx