应用程序中有个menustrip菜单,遍历菜单下的所有菜单及所有form、form中的控件,并把所有窗体跟控件显示到一个treeview中的相应的菜单名下
www.diybl.com 时间 : 2011-08-03 作者:佚名 编辑:hawk 点击: [ 评论 ]
#region//遍历MenuStrip所有子菜单并显示到树上,同时判断每个子菜单下是否有子窗体,是调用 TraverseFormBDTree方法将其窗体及其控件名显示到treeview中
/// <summary>
/// 遍历MenuStrip所有子菜单并显示到树上,同时判断每个子菜单下是否有子窗体,是调用 TraverseFormBDTree方法将其窗体及其控件名显示到treeview中
/// </summary>
/// <param name="ctrl">是带有Menustrip的一个Form窗体</param>
public void TraverseMenu(Control ctrl)
{
foreach (Control c in ctrl.Controls)//遍历窗体中的控件
{
//toolbar1(c);
if (c is MenuStrip)//判断控件是否为Menustrip
{
MenuStrip menu = (MenuStrip)c;
foreach (ToolStripMenuItem MenuItem2 in menu.Items)//遍历menustrip的 一级菜单并将其显示到树上
{
treeView1.Nodes.Add(MenuItem2.Name, MenuItem2.Text);
if (TraverseForm(MenuItem2.Text.Trim()) == true)//调用方法TraverseForm判断是否存在窗体
{
TraverseFormBDTree(MenuItem2.Text, treeView1.Nodes[MenuItem2.Name]);//存在调用方法TraverseFormBDTree
}
else
{
for (int i = 0; i < MenuItem2.DropDownItems.Count; i++)//遍历menustrip遍历二级菜单
{
treeView1.Nodes[MenuItem2.Name].Nodes.Add(MenuItem2.DropDownItems[i].Name, MenuItem2.DropDownItems[i].Text);
if (TraverseForm(MenuItem2.DropDownItems[i].Text) == true)
{
TraverseFormBDTree(MenuItem2.DropDownItems[i].Text, treeView1.Nodes[MenuItem2.Name].Nodes[MenuItem2.DropDownItems[i].Name]);
}
}
}
}
}
}
}
#endregion
#region//获取当前应用程序所有的form窗体并传入菜单中的菜单显示值做为判断条件,如果传入的值可以找到相应窗体返回True,否者返回false
/// <summary>
/// 获取当前应用程序所有的form窗体并传入菜单中的菜单显示值做为判断条件,如果传入的值可以找到相应窗体返回True,否者返回false
/// </summary>
/// <param name="Str">这里是menustrip中一个item的显示值</param>
/// <returns>返回值为true表示能找到相应窗体</returns>
public bool TraverseForm(string Str)
{
Assembly a = Assembly.LoadFile(Application.ExecutablePath);//.net中的反射
Type[] types = a.GetTypes();
foreach (Type t in types)
{
if (t.BaseType.Name == "Form")
{
Form f = (Form)Activator.CreateInstance(t, true);
if (f != null)
{
// MessageBox.Show(f.Text);
if (f.Text == Str)
{
return true;
}
}
}
}
return false;
}
#endregion
#region//递归遍历一个Form中的控件是否为button,或者是toopstrip中的toolstripbutton,如果是将基显示到树上,
/// <summary>
/// 递归遍历一个Form中的控件是否为button,或者是toopstrip中的toolstripbutton,如果是将基显示到树上,
/// </summary>
/// <param name="ctrl">窗体的控件</param>
/// <param name="treenode">一个treeview的结点</param>
private void TraverseFormCtrlAndBindTree(Control ctrl, TreeNode treenode)
{
foreach (Control c in ctrl.Controls)//遍历窗体中的控件
{
if (c is TabControl) //判断是否为TabControl
{
TabControl tc = (TabControl)c;//将c强强制转为为TabControl类型
foreach (TabPage tp in tc.TabPages)//遍历TabControl中的TabPage选项
{
treenode.Nodes.Add(tp.Name, tp.Text);//将名称赋值到treeview结点上。
TraverseFormCtrlAndBindTree(tp, treenode.Nodes[tp.Name]);//递归调用TraverseFormCtrlAndBindTree,遍历下级控件
}
}
else
{
if (c is Button) //判断是否为Button
{
treenode.Nodes.Add(c.Name, c.Text);
TraverseFormCtrlAndBindTree((Button)c, treenode.Nodes[c.Name]);
}
else
if (c is ToolStrip) //判断是否为ToolStrip
{
ToolStrip TB = (ToolStrip)c;
for (int i = 0; i < TB.Items.Count; i++)
{
//MessageBox.Show(TB.Items[i].GetType().ToString());
if (TB.Items[i].GetType().ToString() == "System.Windows.Forms.ToolStripButton")//判断是否为ToolStripButton
{
treenode.Nodes.Add(TB.Items[i].Name, TB.Items[i].Text);
}
}
}
else
{
//try
//{
TraverseFormCtrlAndBindTree(c, treenode);
//}
//catch
//{
// MessageBox.Show(c.GetType().ToString());
//}
}
}
}
}
#endregion