`
isiqi
  • 浏览: 16075099 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Vs2005的win form动态生成菜单

阅读更多

这几天想用vs2005做点东西。要用到windows form 的MainMenu控件。于是想做成动态生成并且动态梆定事件,在网上找了一下没有发现什么好的方法。于是自己来研究一下。以前是做web form的东西,对windows form还真有点陌生的感觉。还好以前用Delphi也做过类似人功能有一点印象。就是用递归去创建菜单。好了不多说了,下面看代码。


privatevoidfrmMain_Load(objectsender,EventArgse)
{
CreateMenu();
}


/**////<summary>
///动态创建菜单
///</summary>

privatevoidCreateMenu()
{
//定义一个主菜单
MenuStripmainMenu=newMenuStrip();
DataSetds
=newDataSet();
//从XML中读取数据。数据结构后面详细讲一下。
ds.ReadXml(@"..\..\Menu.xml");
DataViewdv
=ds.Tables[0].DefaultView;
//通过DataView来过滤数据首先得到最顶层的菜单
dv.RowFilter="ParentItemID=0";
for(inti=0;i<dv.Count;i++)
{
//创建一个菜单项
ToolStripMenuItemtopMenu=newToolStripMenuItem();
//给菜单赋Text值。也就是在界面上看到的值。
topMenu.Text=dv[i]["Text"].ToString();
//如果是有下级菜单则通过CreateSubMenu方法来创建下级菜单
if(Convert.ToInt16(dv[i]["IsModule"])==1)
{
//以ref的方式将顶层菜单传递参数,因为他可以在赋值后再回传。--也许还有更好的方法^_^.
CreateSubMenu(reftopMenu,Convert.ToInt32(dv[i]["ItemID"]),ds.Tables[0]);
}

//显示应用程序中已打开的MDI子窗体列表的菜单项
mainMenu.MdiWindowListItem=topMenu;
//将递归附加好的菜单加到菜单根项上。
mainMenu.Items.Add(topMenu);
}

mainMenu.Dock
=DockStyle.Top;
//将窗体的MainMenuStrip梆定为mainMenu.
this.MainMenuStrip=mainMenu;
//这句很重要。如果不写这句菜单将不会出现在主窗体中。
this.Controls.Add(mainMenu);
}


/**////<summary>
///创建子菜单
///</summary>
///<paramname="topMenu">父菜单项</param>
///<paramname="ItemID">父菜单的ID</param>
///<paramname="dt">所有菜单数据集</param>

privatevoidCreateSubMenu(refToolStripMenuItemtopMenu,intItemID,DataTabledt)
{
DataViewdv
=newDataView(dt);
//过滤出当前父菜单下在所有子菜单数据(仅为下一层的)
dv.RowFilter="ParentItemID="+ItemID.ToString();

for(inti=0;i<dv.Count;i++)
{
//创建子菜单项
ToolStripMenuItemsubMenu=newToolStripMenuItem();
subMenu.Text
=dv[i]["Text"].ToString();
//如果还有子菜单则继续递归加载。
if(Convert.ToInt16(dv[i]["IsModule"])==1)
{
//递归调用
CreateSubMenu(refsubMenu,Convert.ToInt32(dv[i]["ItemID"]),dt);
}

else
{
//扩展属性可以加任何想要的值。这里用formName属性来加载窗体。
subMenu.Tag=dv[i]["FormName"].ToString();
//给没有子菜单的菜单项加事件。
subMenu.Click+=newEventHandler(subMenu_Click);
}

if(dv[i]["ImageName"].ToString().Length>0)
{
//设置菜单项前面的图票为16X16的图片文件。
Imageimg=Image.FromFile(@"..\..\Image\"+dv[i]["ImageName"].ToString());
subMenu.Image
=img;
subMenu.Image.Tag
=dv[i]["ImageName"].ToString();
}

//将菜单加到顶层菜单下。
topMenu.DropDownItems.Add(subMenu);
}

}


/**////<summary>
///菜单单击事件
///</summary>
///<paramname="sender"></param>
///<paramname="e"></param>

voidsubMenu_Click(objectsender,EventArgse)
{
//tag属性在这里有用到。
stringformName=((ToolStripMenuItem)sender).Tag.ToString();
CreateFormInstance(formName);
}


/**////<summary>
///创建form实例。
///</summary>
///<paramname="formName">form的类名</param>

privatevoidCreateFormInstance(stringformName)
{
boolflag=false;
//遍历主窗口上的所有子菜单
for(inti=0;i<this.MdiChildren.Length;i++)
{
//如果所点的窗口被打开则重新激活
if(this.MdiChildren[i].Tag.ToString().ToLower()==formName.ToLower())
{
this.MdiChildren[i].Activate();
this.MdiChildren[i].Show();
this.MdiChildren[i].WindowState=FormWindowState.Normal;
flag
=true;
break;
}

}

if(!flag)
{
//如果不存在则用反射创建form窗体实例。
Assemblyasm=Assembly.Load("Fastyou.BookShop.Win");//程序集名
objectfrmObj=asm.CreateInstance("Fastyou.BookShop.Win."+formName);//程序集+form的类名。
Formfrms=(Form)frmObj;
//tag属性要重新写一次,否则在第二次的时候取不到。原因还不清楚。有知道的望告知。
frms.Tag=formName.ToString();
frms.MdiParent
=this;
frms.Show();
}

}
<?xmlversion="1.0"encoding="utf-8"?>
<Menus>
<MenuItem>
<Text>资料管理</Text>
<ItemID>1000</ItemID>
<ParentItemID>0</ParentItemID>
<FormName></FormName>
<IsModule>1</IsModule>
<Level>1</Level>
<ImageName>01.bmp</ImageName>
</MenuItem>
<MenuItem>
<Text>产品管理</Text>
<ItemID>1100</ItemID>
<ParentItemID>0</ParentItemID>
<FormName></FormName>
<IsModule>1</IsModule>
<Level>1</Level>
<ImageName>16x16_ico_pdf.gif</ImageName>
</MenuItem>
<MenuItem>
<Text>进书管理</Text>
<ItemID>100001</ItemID>
<ParentItemID>1000</ParentItemID>
<FormName>frmInputBooks</FormName>
<IsModule>0</IsModule>
<Level>2</Level>
<ImageName>crest16x16.gif</ImageName>
</MenuItem>
<MenuItem>
<Text>买卖管理</Text>
<ItemID>100002</ItemID>
<ParentItemID>1000</ParentItemID>
<FormName></FormName>
<IsModule>1</IsModule>
<Level>2</Level>
<ImageName>ico16-16.gif</ImageName>
</MenuItem>
<MenuItem>
<Text>作业管理</Text>
<ItemID>110001</ItemID>
<ParentItemID>1100</ParentItemID>
<FormName></FormName>
<IsModule>1</IsModule>
<Level>2</Level>
<ImageName>ico_info_16x16_mask.gif</ImageName>
</MenuItem>
<MenuItem>
<Text>买书管理</Text>
<ItemID>10000201</ItemID>
<ParentItemID>100002</ParentItemID>
<FormName></FormName>
<IsModule>1</IsModule>
<Level>3</Level>
http://www.cnblogs.com/Images/Outlining
分享到:
评论

相关推荐

    用c#编译一个windows程序

     在SolutionView中双击Form1.cs打开Form1,在Toolbox-&gt;Win Forms中选择MainMenu,并在Form1中画出,在“TypeHere”字样处我们可以输入菜单条。   双击关于字样,系统会为我们添加该菜单条的处理代码,我们可以在...

    源码合集之12套Forms

    Fully functionalSource: IncludedCB4 CB5 Win95Menu.zipWin95Menu适用于:Delphi5评述:Win95菜单BitmapMenu.zipBitmapMenu适用于:Delphi5评述:生成图片菜单,就象WIN98的开始菜单一样colorform.zipcolorform适用...

    400个DreamWeaver插件

    mxp/这个插件用来代替Dreamweaver File菜单下的New Form Template命令。作用是可以侦测出站点内的模板,这样就直接打开了,而不象以前还需要在对话框中选择 mxp/在代码编辑环境下,插入一个脚本函数,函数名和参数都...

    asp.net知识库

    VS2005 ASP.NET本地化学习笔记&感受 在自定义Server Control中捆绑JS文件 Step by Step 深度解析Asp.Net2.0中的Callback机制 使用 Web 标准生成 ASP.NET 2.0 Web 站点 ASP.NET 2.0基于SQLSERVER 2005的aspnetdb.mdf...

    Visual C++2010开发权威指南(共三部分).part1.rar

    3.3 动态菜单操作 131 3.3.1 添加菜单 131 3.3.2 插入菜单 133 3.3.3 删除菜单 135 3.3.4 插入菜单的命令响应 136 3.3.5 修改菜单 137 3.4 小结 140 第4章 Visual C++ 2010 MFC对话框编程 141 4.1 对话框简介 141 ...

    计算机二级测试题 可以给大家做个参考

    单击“工具\向导\表单”菜单项,并显示“向导选取”对话框。  2. 在“向导选取”对话框中,选择“表单向导”并单击“确定”按钮,并显示“表单向导”对话框。  3. 在“表单向导”对话框的“步骤1-字段选取”中...

    70款经典Dreamweaver插件

    chromeless_win_wind 制作弹出无边浏览小窗口,现在网上最为流行的 scrollablearea 使用层制作IE中可控制上下滚动的看板 right_click_menu_builder 右键菜单扩展功能 flashtext 制作仿Flash的文字效果 typewriter 让...

    Dreamweaver 插件集

    一组关于iframe的插件,可以动态的改变iframe中的页面 MX152319_save_all 在Drw的File菜单下加一个Save All命令,用来保存所有Dreamweaver窗口的文件 Layerfx 可以让层做绕定轴转动、震动、加速运动....... xp...

    华报智能报表工具

     报表文档和报表数据可以通过URL(或本地文件路径)请求从Web服务器(或本地操作系统)的返回结果中加载,可以从内存中的XML字符串加载,也可以通过编程(调用API编程接口)动态生成。 ReportAll控件/插件不依赖于...

    API之网络函数---整理网络函数及功能

    API之网络函数1. API之网络函数 WNetAddConnection 创建...GetSubMenu 取得一个弹出式菜单的句柄,它位于菜单中指定的位置 GetSystemMenu 取得指定窗口的系统菜单的句柄 HiliteMenuItem 控制顶级菜单条目的加亮显示...

    Qt Creator 的安装和hello world 程序+其他程序的编写--不是一般的好

    但Qt Creator 默认是用动态链接的, 就是可执行程序在运行时需要相应的.dll 文件。我们点击生成的.exe 文件,首 先可能显示“没有找到mingwm10.dll,因此这个应用程序未能启动。重新安装 应用程序可能会修复此问题。...

    delphi三层架构框架

    系统功能根据业务模块信息自动生成,可以手动配置功能菜单列表; 框架中包含用户及权限管理插件,拿来即用,此模块可严格控制各功能Form 的详细权限(添加、修改、删除)、特殊数据的读取权限; 框架中包含了...

    Visual C++ 编程资源大全(控件 窗体)

    noform.zip 没有文档类的MDI怎样让MDI程序不需要文档的支持(33KB)&lt;END&gt;&lt;br&gt;98,ROTFONT.zip 用于在窗口中显示任意角度文字的控件(5KB)&lt;END&gt;&lt;br&gt;99,TRAYICON.zip 用于在WIN95的状态栏中显示程序的运行状态(32...

    Delphi5开发人员指南

    1.4.6 源代码生成器 10 1.5 创建一个简单的应用程序 11 1.6 事件机制的优势在哪里 12 1.7 加速原型化 13 1.8 可扩展的组件和环境 13 1.9 IDE最重要的十点功能 13 1.10 总结 15 第2章 Object Pascal语言 16 2.1 注解 ...

    WP主题:HotNewspro 2.72

    ■ 如果启用主题后首页只显示导航菜单及一个标题,说明你的主机不支持主题文字截断函数mb_strimwidth,最有可能的原因是,主机空间缺少mb_string extension(Linux主机)及php_mbstring.dll(WIN主机)扩展服务,...

    编译的 HTML 帮助文件 (.chm) DHTML手册

    oncontextmenu 在用户使用鼠标右键单击客户区打开上下文菜单时触发。 oncontrolselect 当用户将要对该对象制作一个控件选中区时触发。 oncut 当对象或选中区从文档中删除并添加到系统剪贴板上时在源元素上触发。 ...

    VB编程资源大全(源码 其它3)

    556,delay1.zip 源码设计中的延时功能(1KB) 557,type_1.zip 趣味打字2.1(233KB) 558,test1.zip asp编写动态网页计数器(1KB) 559,hztosm.zip 汉字转声母完全源代码(90KB) 560,...

    VB编程资源大全(源码 其它1)

    556,delay1.zip 源码设计中的延时功能(1KB) 557,type_1.zip 趣味打字2.1(233KB) 558,test1.zip asp编写动态网页计数器(1KB) 559,hztosm.zip 汉字转声母完全源代码(90KB) 560,...

    VB编程资源大全(源码 其它2)

    556,delay1.zip 源码设计中的延时功能(1KB) 557,type_1.zip 趣味打字2.1(233KB) 558,test1.zip asp编写动态网页计数器(1KB) 559,hztosm.zip 汉字转声母完全源代码(90KB) 560,...

Global site tag (gtag.js) - Google Analytics