`
isiqi
  • 浏览: 16496024 次
  • 性别: 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#WIN FORM基础

    **C# Win Form基础**是Windows应用程序开发的重要领域,它基于.NET Framework或.NET Core,用于构建桌面用户界面。本文将深入探讨Win Form的基本概念、组件、属性、事件以及开发流程,帮助初学者全面理解并掌握C# ...

    C# winform 实现按钮固定到菜单栏以及右键菜单

    `Form1.Designer.cs`是Visual Studio自动生成的,包含了窗体的布局和控件信息;`Form1.cs`是主窗体的代码逻辑;`Program.cs`包含了应用程序的入口点;`Test.csproj`是项目的构建文件,描述了项目结构和编译规则;`...

    Windows XP风格窗体生成器VB版

    Windows XP风格窗体生成器VB版是一款用于创建具有Windows XP经典视觉效果的用户界面的工具,特别适合VB(Visual Basic)开发者使用。该生成器帮助开发者轻松地为应用程序赋予那种光滑、半透明以及熟悉的“XP”外观,...

    Postman-win64-6.0.10-Setup.zip

    - 文档生成:Postman可以自动生成API文档,方便团队协作和外部接口使用者查阅。 - 基准测试:通过性能测试,可以了解API的响应时间和吞吐量。 - 集合:可以将相关的请求组织成集合,便于管理和重复执行。 - ...

    Postman-win64工具

    总结起来,Postman-win64工具为开发者提供了全面的接口测试和管理能力,无论是在单个请求的调试,还是在复杂的接口测试和文档生成方面,都表现得极其出色。通过熟练掌握和利用这款工具,能显著提升开发效率和产品...

    用c#编译一个windows程序

    系统将自动生成项目框架,包括默认的Form1.cs文件。 开发环境包括四个主要区域: 1. A区是工具箱,包含各种控件,如数据库控件、组件和窗体控件,可以通过拖放方式添加到窗体中。 2. B区是设计工作区,用于设计应用...

    源码合集之12套Forms

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

    C#编码规范

    2. Web Form 内部控件命名:与Win Form类似,但通常会考虑更多的客户端交互,如`btnSubmit_Click`表示点击事件处理程序。 3. C#数据组件命名:数据库相关的组件,如数据集`dsEmployees`,数据表`dtEmployeeDetails`...

    VB6 控件 源码 包 ocx ctl

    2. **Win7风格控件**: "高仿Win7风格全控件包(AeroSuite)"提供了一组模仿Windows 7用户界面风格的控件,如 Aero Glass 效果、Aero Ribbon 菜单等。这使得开发者可以轻松地为VB6应用程序添加现代感和一致性,使其看...

    VB用Adodc控件连接sql server 2000数据库的方法

    7. **编程连接**:在Form1的Load事件处理程序中(在"Private Sub Form_Load()"和"End Sub"之间),编写代码来设置Adodc1控件的属性。设置`Adodc1.Visible = False`使其不可见,`Adodc1.RecordSource = "select * ...

    哈夫曼编码和译码系统

    Win Form是一种.NET框架下的应用程序开发工具,允许开发者创建具有丰富交互性的桌面应用,包括按钮、文本框、菜单等控件,使得用户可以方便地进行编码和解码操作。 哈夫曼编码过程包括以下几个步骤: 1. **频率统计...

    400个DreamWeaver插件

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

    C# WinForm注册表实现开机启动和托盘显示

    在C# WinForm应用开发中,有时候我们需要实现应用程序在用户开机时自动启动,并且在系统托盘区域显示图标以便用户方便地管理和访问...在实际项目中,还可以进一步扩展这些功能,例如添加右键菜单来控制应用程序的行为。

    VS2008使用Qt

    2. **下载并安装Qt库**:`qt-win-opensource-4.7.0-vs2008.exe`。此版本的Qt库是专为VS2008定制的,确保与IDE兼容。假设安装路径为`C:\Qt4.7.0`。 3. **下载并安装Qt Visual Studio Add-in**:`qt-vs-addin-1.1.7....

    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 ...

    wxFormBuilder 3.6.2

    2. **代码生成**:生成的代码是基于wxWidgets库的,这使得代码易于理解和维护。 3. **多种平台支持**:虽然这里提到的是win32/64版本,但wxWidgets和wxFormBuilder本身是跨平台的,也适用于Linux和macOS等操作系统。...

    qt入门教程

    然后,通过Add New菜单创建一个C++ Source File,命名为main.cpp。在main.cpp中编写基本的"Hello World"代码: ```cpp #include #include int main(int argc, char *argv[]) { QApplication app(argc, argv); ...

Global site tag (gtag.js) - Google Analytics