C# TreeView菜单,MenuStrip菜单递归动态生成例子

这是在权限系统中设计中常用到的两种菜单处理方式 private DataTable ModuleTable;
private void FrmMain_Load(object sender, EventArgs e) {
try { InitMenu(); } catch { MenuTree.Nodes.Clear(); }

///

/// 初始化菜单 /// protected void InitMenu() { DataSet ds= new DataSet(); ds=bll.GetModuleTypeList(""); RGP.BLL.RGP_Modules bll = new RGP.BLL.RGP_Modules(); ModuleTable = ds.Tables[0]; //取得所有数据得到 DataTable
//加载 TreeView 菜单 LoadNode(MenuTree.Nodes, "0");
//加载 MenuStrip 菜单

ToolStripMenuItem topMenu = new ToolStripMenuItem(); LoadSubMenu(ref topMenu, 0);
}
///

/// 递归创建 TreeView 菜单(模块列表) /// /// 子菜单 /// 子菜单上级 ID protected void LoadNode(TreeNodeCollection node, string MtID) { DataView dvList = new DataView(ModuleTable); dvList.RowFilter = "ModuleTypeSuperiorID=" + MtID; //过滤父节点 TreeNode nodeTemp; foreach (DataRowView dv in dvList) { nodeTemp = new TreeNode(); nodeTemp.Tag = dv["ModuleTypeID"].ToString() + ",0"; nodeTemp.Text = dv["ModuleTypeName"].ToString(); //节点名称 node.Add(nodeTemp); //加入节点 //nodeTemp.SelectAction = TreeNodeSelectAction.Expand; //nodeTemp.Expanded = false;
this.LoadNode(nodeTemp.Nodes, nodeTemp.Tag.ToString().Split(',')[0]); //递归
//增加子模块分类 RGP.BLL.RGP_Modules bll = new RGP.BLL.RGP_Modules(); DataSet Module = bll.GetModuleList("ModuleTypeID=" + dv["ModuleTypeID"].ToString()); int i = 0; foreach (DataRow child_dr in Module.Tables[0].Rows) {

if ((UserBox.GetUserTable().IsLimit == true || (child_dr["ModuleDisabled"].ToString().ToLower() == "true" && UserHandle.ValidationModule(int.Parse(child_dr["ModuleID"].ToString()), RGP_Ta g.Browse))) && child_dr["IsMenu"].ToString().ToLower() == "true") { TreeNode ChildNode = new TreeNode(child_dr["ModuleName"].ToString()); ChildNode.Tag = child_dr["ModuleID"].ToString() + ",1"; ChildNode.Expand(); nodeTemp.Nodes.Add(ChildNode); i++; } }
//删除不必要的模块分类节点。 if (i == 0) { MenuTree.Nodes.Remove(nodeTemp); } } }
///

/// 递归创建 MenuStrip 菜单(模块列表) /// /// 父菜单项 /// 父菜单的 ID private void LoadSubMenu(ref ToolStripMenuItem topMenu, int MtID) { DataView dvList = new DataView(ModuleTable); //过滤出当前父菜单下在所有子菜单数据(仅为下一层的) dvList.RowFilter = "ModuleTypeSuperiorID=" + MtID.ToString();

ToolStripMenuItem subMenu; foreach (DataRowView dv in dvList) { //创建子菜单项 subMenu = new ToolStripMenuItem(); subMenu.Text = dv["ModuleTypeName"].ToString(); //判断是否为顶级菜单 if (MtID == 0) { this.SysMainMenu.Items.Add(subMenu); } else { topMenu.DropDownItems.Add(subMenu); }
//递归调用 LoadSubMenu(ref subMenu, Convert.ToInt32(dv["ModuleTypeID"]));
//增加子模块分类 RGP.BLL.RGP_Modules bll = new RGP.BLL.RGP_Modules(); DataSet Module = bll.GetModuleList("ModuleTypeID=" + dv["ModuleTypeID"].ToString()); int i = 0; foreach (DataRow child_dr in Module.Tables[0].Rows) { if ((UserBox.GetUserTable().IsLimit == true || (child_dr["ModuleDisabled"].ToString().ToLower() == "true" && UserHandle.ValidationModule(int.Parse(child_dr["ModuleID"].ToString()), RGP_Ta g.Browse))) && child_dr["IsMenu"].ToString().ToLower() == "true") { ToolStripMenuItem ChildMenu = new ToolStripMenuItem(child_dr["ModuleName"].ToStri

ng()); subMenu.DropDownItems.Add(ChildMenu); i++; } }
//删除不必要的模块分类节点。 if (i == 0) { this.SysMainMenu.Items.Remove(subMenu); } } }
先说一下主要原理: 先说一下主要原理: 此处使用 OnTreeNodePopulate 事件并採用刷新的方式获取数据。第一次加载时获取根结点及其下两 级结点,显示根结点和第一级结点,用第二级结点判断第一级结点是否含有结结点,并缓存第二级结点。下 次逐级扩展时填加已缓存的第二级结点,并取得第二级结点的所有子结点。
说明:为什么要取第二级数据? 因为取得第一级数据后,您不知道是否有一下级。所以再取得第一级数据后的下一级数据,并用 nodeDictionary 变量缓存所有第二级数据便于下次加载。 下次点击扩展时,先从变量中找此级的数据,找到后读取此级的下一级数据。
原理比较枯燥,用例子说明: 原理比较枯燥,用例子说明: 1、在页面中放入 TreeView。并设置 OnTreeNodePopulate 事件和 EnableClientScript 属性。 代码

EnableClientScript="False"> 此处说明一下 EnableClientScript 属性。如果 EnableClientScript="True",当点击扩展结点时就调用客 户端的角本, 并不会回发, 所取出的值与当前点的值不一致, 造成成错误。 所以此处要将 EnableClientScript 属性设为 true。
2、后台代码(代码中涉及取数据的方法没有给出,您可以根据情况自己编写取数据方法)
代码 //用于缓存数据 private static Dictionary> nodeDictionary = new Dictionary>(); protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { nodeDictionary.Clear(); BindDepartmentTree(this.PwPid, "system"); } } //取得根目录的第一级数据 public void BindDepartmentTree(string pwPid, string departmentNo) { nodeDictionary.Clear(); UserPower userPower = new UserPower(); //取得根目录 PW_Department pwSystem = userPower.GetParentDepartment(pwPid, departmentNo);

tvDepartment.Nodes.Clear(); if (pwSystem == null) { return; } TreeNode tnRootNode = new TreeNode(); tnRootNode.Text = pwSystem.departmentName; tnRootNode.Value = pwSystem.departmentNo; //取得根目录的第一级数据 IList ilPwDepts = userPower.GetChildDepartment(PwPid, departmentNo); if (ilPwDepts == null || ilPwDepts.Count < 1) { return; } foreach (PW_Department pdItem in ilPwDepts) { TreeNode tnNewNode = new TreeNode(pdItem.departmentName, pdItem.departmentNo); //取得第一级数据下的第二级数据 IList ilChilldDepts = userPower.GetChildDepartment(PwPid, pdItem.depart mentNo); tnRootNode.ChildNodes.Add(tnNewNode); if (ilChilldDepts == null || ilChilldDepts.Count < 1) { } else { //设置父结点可以扩展 tnNewNode.PopulateOnDemand = true; tnNewNode.Expanded = false; nodeDictionary.Add(pdItem.departmentNo, ilChilldDepts); } }

tvDepartment.Nodes.Add(tnRootNode); } //TreeNodePopulate 事件,用于分级取数据 protected void tvDepartment_TreeNodePopulate(object sender, TreeNodeEventArgs e) { //取得当前点击的 node 的值 if (tvDepartment.SelectedNode != null) { string sValue = tvDepartment.SelectedNode.Value; } UserPower userPower = new UserPower(); string nodeID = e.Node.Value; if (nodeDictionary != null) { if (nodeDictionary.Keys.Contains(nodeID)) { if (nodeDictionary[nodeID].Count>0) { //从缓存中取得当前结点的第一级结点 foreach (PW_Department pdItem in nodeDictionary[nodeID]) { TreeNode tnNewNode = new TreeNode(pdItem.departmentName, pdItem.department No); //取得当前结点第一级结点下的子结点 IList ilPwDepts = userPower.GetChildDepartment(PwPid, tnNewNo de.Value); //如果没有子结点,不可以扩展 if (ilPwDepts == null || ilPwDepts.Count < 1) { tnNewNode.Expanded = false; tnNewNode.PopulateOnDemand = false; tnNewNode.SelectAction = TreeNodeSelectAction.Select;

e.Node.ChildNodes.Add(tnNewNode); } else { //设置父结点可以扩展 tnNewNode.PopulateOnDemand = true; tnNewNode.Expanded = false; tnNewNode.SelectAction = TreeNodeSelectAction.Select; e.Node.ChildNodes.Add(tnNewNode); //级存当前结点第一级结点下的子结点 nodeDictionary.Add(pdItem.departmentNo, ilPwDepts); } } //移除已展开的节点 nodeDictionary.Remove(nodeID); } } } }
摘要: 摘要:了解 https://www.360docs.net/doc/1614090270.html, 用于显示数据的三个控件: DataGrid、DataList 和 Repeater。这些控件中的每一 个都有独特的特性以及相关的优点和缺点。创建显示数据的 https://www.360docs.net/doc/1614090270.html, 应用程序时,为这项工作选择正确 的控件非常重要。正如将在本文中所看到的一样,选择使用 DataGrid、DataList 还是 Repeater,要权衡 下面三个因素:可用性、开发时间和性能。(12 页打印页) 下载 DataControlsPerfTest_Setup.msi。

本页内容
简介 数据 Web 控件之间的相似性 研究 DataGrid Web 控件 分析 DataList 深入研究 Repeater 小结 基准设置
简介
自从出现了像 Microsoft Active Server Pages (ASP) 这样的简单且基于脚本的 Web 编程 编程技术以来, Web 开发又有了很大的发展。传统 ASP 中常见的大量枯燥、重复的编码工作,在 Microsoft https://www.360docs.net/doc/1614090270.html, 中不复 存在了。例如,正如所有传统 ASP 开发人员一度都知道的那样,在传统 ASP Web 页面中显示数据需要 下面的伪代码:
Create connection to the databasePopulate an ADO Recordset with a SQL queryDisplay any header HTML neededFor Each Record in the Recordset Print out the Recordset field(s) and associated HTML recordNextDisplay any footer HTML needed
例如,要在 HTML
Move to the next


中显示记录集的内容,开发人员则不得不为

标记 (tag) 生成 HTML 标记 (markup),然后循环遍历记录集中的每一条记录,每次循环生成一个

标记,以及许多

标记和要显示的记录集字段的值。最后,在循环之后,开发人员需要生成结束


标记。 传统 ASP 所要求的这种方法有一个很大的缺点:它把 HTML 内容和 ASP Web 页面的源代码 源代码紧密集成 源代码 在一起。因为没有分离代码和 HTML 内容,所以更改 HTML 的内容及其困难,尤其是对不懂编程技术的 数据库结果和生成它的内容都需要代码,所以 图形艺术家或 Web 设计者来说更是如此。而且,因为检索数据库 数据库 代码和 HTML 内容的这种集成相对来说需要大量的代码。 幸好,https://www.360docs.net/doc/1614090270.html, 提供了三个控件,使得在 https://www.360docs.net/doc/1614090270.html, Web 页面中显示数据绝对比传统 ASP 所需的迭代 也许, 方式简单得多。 这三个控件是 DataGrid、 DataList 和 Repeater, 以后我将称之为数据 Web 控件。 如果您已经开发过 https://www.360docs.net/doc/1614090270.html, Web 页面,那么至少会对这三个控件中的一个有一些经验。通常,开发人员 从学习 DataGrid 开始,这是因为 DataGrid 使用简单以及它具有允许数据排序、分页和编辑的功能。但 是,在 https://www.360docs.net/doc/1614090270.html, Web 页面中显示数据时,DataGrid 并不总是控件的最佳选择。 在本文中,我们将研究这些数据 Web 控件中每个控件的独特特性。这些特性赋予每个数据 Web 控件许 多优点和缺点。因为每一个数据 Web 控件都有一些缺点,所以没有可用于任何作业的“完美”控件。决定 使用哪个控件时, 必须权衡这三个数据 Web 控件每一个的优点和缺点, 然后再决定哪个控件是最合适的。 为了协助进行比较,研究每一个数据 Web 控件时,我们将着重于这三个衡量标准:可用性(从 Web 访 问者的角度)、开发时间和性能。我们首先快速浏览一下这三个数据 Web 控件之间的相似性。接下来我 们将深入研究 DataGrid,然后研究 DataList,最后查看 Repeater。对于每一个控件,我们将研究这些控 件的功能,并讨论它的功能集是如何影响这些衡量标准的。 返回页首
数据 Web 控件之间的相似性
在研究数据 Web 控件之间的差异(这些差异使它们区别于其他控件)之前,先看一下它们的相似性。从 较高级别观点来看,最基本的相似性是,DataGrid、DataList 和 Repeater 都设计为了执行大致相同的操 作: 显示数据。 另一个相似性把数据绑定到数据 Web 控件所需的代码。 具体地说, 只需要下面两行代码:
dataWebControlID.DataSource = someDataSourcedataWebControlID.DataBind()
通常,赋给数据 Web 控件的
DataSource

属性的
someDataSource
对象是一个 DataSet、SqlDataReader、OleDbDataReader 或一个集合(如 Array、ArrayList 或
System.Collections
命名空间中的其他某个类)。但是,任何实现 IEnumerable 接口的对象都可以绑定到数据 Web 控件。
DataBind()
方法枚举指定的
DataSource
中的记录。对于
DataSource
中的每一条记录,都会创建一个项并追加到数据 Web 控件的
Items
集合中。 数据 Web 控件中的每一项都是一个类实例。 用于控件每一项的特定类取决于该数据 Web 控件。 例如,DataGrid 中的每一项都是
DataGridItem
类的一个实例,而 Repeater 中的每一项都是
RepeaterItem
类的一个实例。 每个数据 Web 控件会为它的每一项使用不同的类,因为是这些项呈现的方式决定了数据 Web 控件生成 的 HTML 标记。例如,DataGridItem 类是从
TableRow
类中派生的,这意味着每个
DataGridItem

都或多或少地呈现为一个表行。这很有意义,因为 DataGrid 设计为在 HTML


标记内以表格形式显示数据,在 HTML

中,每一项都呈现为单独一行。另一方面,Repeater 设计为允许对它的输出进行完全自定义。因此, RepeaterItem 类不从
TableRow
类中派生并不令人惊讶。 数据 Web 控件之间的另一个相似性是每个控件都能使用模板提供高度自定义的输出。 DataList 和 Repeater 控件必须使用模板指定它们的内容,而 DataGrid 则通过 TemplateColumn 列类型可以为特定 的列选择使用模板(我们将在下一节“研究 DataGrid Web 控件”中讨论各种不同的 DataGrid 列类型)。 最后一个值得注意的是 DataGrid 和 DataList 控件是从
WebControl
类中派生的,而 Repeater 控件是从
Control
类中派生的。
WebControl
类包含许多美学方面的属性,例如
BackColor

ForeColor

CssClass

BorderStyle

等。这意味着如果使用 DataGrid 和 DataList,就可以通过它们从
WebControl
类中继承的属性指定样式设置。 Repeater 没有任何这样的样式属性。 而 正如我们将在“深入研究 Repeater” 一节中所讨论的一样,对 Repeater 输出的任何可视设置都必须在 Repeater 的模板中指定。 返回页首
研究 DataGrid Web 控件
DataGrid Web 控件是这三个数据 Web 控件中功能最多的, 但是在自定义控件生成的实际 HTML 标记时, 它又是最不灵活的。呈现的 HTML 标记中的这种不灵活性,是由于 DataGrid 是设计用于使用 HTML


以表格形式显示数据所造成的。因此,对于每一条绑定到 DataGrid 的记录,都会创建一个单独的表行(

),对于要显示的记录中的每一个字段,都会创建一个单独的表列(

)。 DataGrid 提供了许多功能,可极大地提高要显示的数据的可用性。例如,把 DataGrid 的
AllowSorting
属性设置为 True 并添加一点源代码,开发人员就可以把一个普通的 DataGrid 变成一个其数据可以由最 终用户排序的 DataGrid。另外,再增加一点工作量,开发人员就能增强 DataGrid 的功能以允许数据分页 或数据的内联编辑。这些功能明显增强了 DataGrid 的可用性。 除了在可用性方面得分很高,DataGrid 还提供了很短的开发时间。要使用 DataGrid 开始在 https://www.360docs.net/doc/1614090270.html, Web 页面中显示数据, 只需要把 DataGrid 添加到 Web 页面中并编写两行必要的代码: 第一行把数据绑 定到 DataGrid 的
DataSource
,第二行调用 DataGrid 的
DataBind()

方法。显然,随着添加到 DataGrid 中的功能数量的增加,开发时间也增加了,但这只是把开发时间和其 他数据 Web 控件进行比较。假设您要允许对 Repeater 显示的数据进行排序。添加这样的功能是一定可 能的,但是与用 DataGrid 完成同样的操作相比,这需要明显多很多的时间和精力。 尽管 DataGrid 具有良好的可用性和开发时间得分,但是这个控件有两个固有的缺点。第一,正如前面所 谈到的,DataGrid 在对所呈现的 HTML 标记进行自定义方面的功能很有限。是的,您可以自定义 DataGrid 的不同行和列的字体、颜色和边框,但是事实仍然是,当 DataGrid 显示数据时,结果将是一个 HTML



DataSource
中的每一条记录都对应其中一个

,每一个字段都对应其中一个

标记中。因此,即使可以用 TemplateColumn 自定义每一行的特定列的 HTML 输出,而 DataGrid 仍然 呈现为 HTML

。 具体地说,DataGrid 中的每一列都是一个从
DataGridColumn
类中派生的类实例。有五个内置的 DataGrid 列类型:
? ? ? ? ?
BoundColumn ButtonColumn EditColumn HyperLinkColumn TemplateColumn
每一个列类型都提供数据或提供某种允许用户和 DataGrid 进行交互的接口。例如,BoundColumn 以纯 文本显示

DataSource
字段的值,而 HyperLinkColumn 则会显示一个超级链接,其文字和 URL 部分可能是
DataSource
字段。除了这些内置的列类型,通过创建
DataGridColumn
类的派生类,还可以创建自定义 DataGrid 列类型。(有关创建一个用于扩展 BoundColumn 功能以限制 显示字符数的列的示例,请参阅 Creating a Custom DataGridColumn Class。) 有了这么多的 DataGrid 列类型,可能就不理解为什么 DataGrid 呈现的 HTML 标记不能进行高度自定 义了。要知道,虽然每一个 DataGrid 列类型在呈现时生成不同的 HTML,但是每一列都包含在一组


标记中,每一行都包含在一组

,其中每一行使用一个

,每一列使用一个

。 DataGrid 的这种限制禁止了更多具有创造性的数据显示。例如,如果要在每一表行中显示五条记录, 就不能使用 DataGrid,必须使用 DataList 或 Repeater。另外,如果要在除

之外的 HTML 标记中显示数据,很遗憾,就不能使用 DataGrid 了。 DataGrid 第二个缺点是它的性能。 DataGrid 是这三个数据 Web 控件中性能最差的。基于这一点,由 DataGrid -特别是具有许多行的 DataGrids -产生的 ViewState 可能会非常大。 如果使用 DataGrid 仅

仅是为了显示数据,则可以关闭 ViewState,但是,使用 DataGrid 的排序、分页或编辑功能时,就不能 这样做了。 为了测试 DataGrid 的性能,我使用了 Microsoft 的免费 Web Application Stress Tool (WAST)。在本文 最后的“基准设置”一节中列出了精确的测试条件和 WAST 设置。另外,测试使用的代码也可在本文最后下 载。 这个 Web Application Stress Tool 会向 Web 服务器 服务器发出一组特定的 URL 请求。对于每一项测试,我都 在一分钟之内尽可能快地不断请求一个 URL。 WAST 报告了许多性能衡量标准;我要关注的一个衡量标 准是每秒请求数,它表明了 Web 服务器每秒能执行多少次 https://www.360docs.net/doc/1614090270.html, Web 页面。 对于一个仅显示数据的简单 DataGrid, 运行了两个测试。 具体地说, DataGrid 显示了来自 Northwinds 数 据库的 Customers 表(Customers 表总共包含 91 条记录)的四个字段。 DataGrid 的
AutoGenerateColumns
属性设置为 True。第一项测试把 DataGrid 放在一个 Web 窗体(

)中,而第二项测试则没有。如果在窗体中放置一个控件而不把它的
EnableViewState
属性显式设置为 False,那么该控件则会用 ViewState 保持它的状态。创建这个 ViewState 项可能是一 个比较费时的过程,因此减少了可处理的总的每秒请求数,结果如图 1 所示。 图
图 1: DataGrid 的每秒请求数 :

正如我们将要在研究 DataList 和 Repeater 时看到的一样,这两个控件都提供了比 DataGrid 更好的性 能。 返回页首
分析 DataList
记得 DataGrid 将呈现为 HTML


,每一个
DataSource
记录作为一个表行(

),每一个记录字段作为一个表列(

)。有时,您可能想更多地控制数据的显示。例如,您可能想把数据显示在 HTML

中,但不是每行显示一条记录,而是每行显示五条记录。或者,您根本不想把数据显示在

标记中,而是想把每个元素显示在一个

标记中。 DataList 放弃了 DataGrid 所采用的“列”概念。相反,DataList 的显示是通过模板定义的。利用模板,开 发人员可以指定混合的 HTML 语法和数据绑定语法。 HTML 语法是标准的 HTML 标记;数据绑定语法 是使用
<%#


%>
标记分隔的,用于从
DataSource
的记录中产生用于构造给定 DataList 项的内容。例如,下面的 ItemTemplate 将显示
DataSource
的字段
CompanyName: <%# DataBinder.Eval(Container.DataItem, "CompanyName") %>
除了数据绑定语法,模板也可以包含 HTML 标记。通过更新上面的模板,可以使
CompanyName
字段以粗体显示,而使
ContactName
字段以非粗体显示在
CompanyName
字段的下面:
<%# DataBinder.Eval(Container.DataItem, "CompanyName") %>
<%# DataBinder.Eval(Container.DataItem, "ContactName") %>

对于 DataList 的 DataSource 中的每一条记录,都要计算 ItemTemplate 的数据绑定语法。数据绑定语 法的输出与 HTML 标记一起指定了为 DataList 项呈现的 HTML。 DataList 还支持其他六个模板,包括 ItemTemplate 在内共有如下七个:
? ?
AlternatingItemTemplate EditItemTemplate

? ? ? ? ?
FooterTemplate HeaderTemplate ItemTemplate SelectedItemTemplate SeparatorTemplate
注意,DataGrid 的 TemplateColumn 仅支持四个模板: ItemTemplate、HeaderTemplate、 FooterTemplate 和 EditItemTemplate。 默认情况下,DataList 将每一项都显示为 HTML


中的一行。但是,通过设置
RepeatColumns
属性,您可以指定表的每一行显示多少个 DataList 项。除了可以指定 HTML

的每一行显示多少个 DataList 项之外,还可以指定 DataList 的内容应该使用

标记显示,而不是使用

标记。 DataList 的
RepeatLayout
属性可以设置为 Table 或 Flow,表示 DataList 中的数据呈现在 HTML

中还是

标记中。

ASP NET+TreeView树型菜单操作实例(代码调试通过)

https://www.360docs.net/doc/1614090270.html, TreeView树型菜单操作实例(代码调试通过) 本实例完成TreeView树型菜单添加,修改,删除,绑定DropDownList功能,移动功能读者可以自行书写.aspx代码

TreeView操作实例
节点名

VC++动态加入和删除菜单的方法

VC++动态加入和删除菜单的方法 在应用程序中,往往要根据当前的操作来增加相应的菜单。动态增加菜单的方法有多 种,本文只讲述利用资源编辑器预创建菜单资源,然后在程序运行中动态加入(或删 除)到主菜单中去的方法。 一、用AppWizard建立一个单文档工程,默认一切选项。在WorkSpace(工作空间)的 ResourecView页中右击Menu资源,加入一个新的菜单,其ID为:IDR_MENU1。为 IDR_MENU1加入一个菜单项和相应的子菜单。如(图一)所示。 二、编辑IDR_MAINFRAME菜单(ID为IDR_MAINFRAME的菜单一般均为主菜单),在【查看 (V)】菜单项下面增加二个子菜单项。如(图二)所示。其属性如下: ID Caption IDC_ADD 加入菜单 IDC_DELETE 删除菜单 三、要访问要菜单,可使用CWnd类的GetMenu()成员函数、或使用全局函数AfxGetMainWnd()―>GetMenu(),它们都返回一个CMenu对象的指针。一旦得到Cmenu指 针,就可以对菜单进行各种操作(装入、增加、插入,删除,更新等等)。通过Cmenu 指针对菜单进行操作后,应使用Cmenu类的Detach()成员函数从Cmenu对象中分离出菜 单,避免发生冲突。之后调用CWnd::DrawMenuBar()重画菜单。 四、为实现加入、删除操作,我们用“ClassWizard”向导为IDC_ADD和 IDC_DELETE增加 两个COMMAND消息映射函数,它们分别为CMainFrame::OnAdd() 和CMainFrame::OnDelete()。接着我们为其编写代码如下: void CMainFrame::OnAdd() //加入菜单操作。 { CMenuaddmenu,*mainmenu; if(!addmenu.LoadMenu(IDR_MENU1)) //装入菜单资源。 { MessageBox("菜单装入失败!","错误",MB_OK|MB_ICONERROR); return; //如装入失败,显示消息框,且返回。 } CStringstr="颜色(&C)"; //要增加的菜单项的标签。 mainmenu=AfxGetMainWnd()->GetMenu(); //取得指向窗口菜单的Cmenu对象的指针。

TreeView绑定SQL数据源

使用TreeView绑定SQL数据源 这里采用了在页面一loading就把数据绑到TreeView的各节点的方式,而不是在展开时再作子节点的绑定,因此在点击父节点时就不会有刷新的感觉了。呵呵,代码并没优化....... aspx页面: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %> 树形节点绑定 .cs文件: using System; using System.Data; using System.Configuration; using System.Collections; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Data.SqlClient; public partial class Default2 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { BindTree(); } } public void BindTree() { SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["CreativeConnectionString"].Connectio

vc++菜单全集

在系统菜单中添加菜单项(一) 本文介绍如何向系统菜单中添加自己的菜单项,如下: 1.创建一个基于对话框的工程:AddMenuToSysMenu。 2.在对话框类中添加一个成员函数:CMenu* m_pMenu;用来添加自己的菜单项。 3.在resouce.h中定义 #define IDI_PECULIARMENU1201 来代表自己要添加的菜单项资源。 4.在OnInitDialog中添加如下代码: m_pMenu = GetSystemMenu(FALSE); m_pMenu->AppendMenu(MF_STRING,IDI_PECULIARMENU,"系统菜单"); 5.在OnSysCommand中添加如下代码相应自己的消息。 elseif(nID == IDI_PECULIARMENU) { MessageBox("系统菜单"," 提示 ",MB_OK|MB_ICONINFORMATION); } 注: 1.改变标题栏菜单图标如下: m_hIcon = AfxGetApp()->LoadIcon(IDI_MAINMENU); 2.用位图填充对话框如下: 在OnPaint中添加如下代码: CDC *pDC = this->GetDC(); CDC m_Menu; m_Menu.CreateCompatibleDC(pDC); CBitmap m_bitmap; m_bitmap.LoadBitmap(IDB_MAIN); m_Menu.SelectObject(&m_bitmap); CRect m_rect; pDC->BitBlt(0,0,800,700,&m_Menu,0,0,SRCCOPY); m_bitmap.DeleteObject(); pDC->DeleteDC(); 带图标的程序菜单(二) 本文介绍在基于单文档程序中,如何实现带图标的程序菜单。如下: 1.创建一个单文档工程:AddIconMenu 2.这个工程里面用到了一个类来实现对程序菜单图标的添加以及颜色的设定等等。 添加到工程。头文件如下:IconMenu.h // IconMenu1.h: interface for the CIconMenu class. // //////////////////////////////////////////////////////////////////////

构建BBS论坛系统项目中后台管理页面中的树形菜单的应用示例

1.1构建BBS论坛系统项目中后台管理页面中的树形菜单的应用示例1.1.1应用XTree树型控件在页面中实现树形菜单 1、应用XTree树型控件 (1)XTree树型控件 xtree.js是Web开发中运用较多的一个树型控件。其入门简单,功能强大,很多人在它的基础上开发出了自己的树型控件。 XloadTree也是https://www.360docs.net/doc/1614090270.html,/公司的基于JavaScript的建立树型目录的开源产品,扩展性强,使用简单。由于XloadTree是基于XmlHttp请求/响应模型,必须使用http协议访问代码才可以正确加载XML文件。 (2)下载XTree树型控件(编程方式的系统包) https://www.360docs.net/doc/1614090270.html,/ https://www.360docs.net/doc/1614090270.html,/download/xtree117.zip

(3)下载XTree树型控件(XML文件方式的系统包、而且该XML文件可以是动态创建)https://www.360docs.net/doc/1614090270.html,/dhtml/xloadtree/xloadtree.html

2、xtree有两种使用模式 其一为显示构造树,而其二为运用XML数据源,同时该XML数据源也可以动态在Servlet 组件中创建。 3、显示构造树(可以参考systemManage/contentPage/leftMenu.jsp) (1)第一步需要引用其样式单文件 (2)第二步再引用 xtree.js 文件 (3)第三步编程WebFXTreeItem以产生出菜单 var treeRoot = new WebFXTree('蓝梦BBS论坛后台管理菜单'); var tree_userInfoManaeFolder = new WebFXTreeItem("用户信息管理") var forwardQueryUserInfoItem=new WebFXTreeItem("查询一般用户信息"); forwardQueryUserInfoItem.action=''; forwardQueryUserInfoItem.target="mainFrame"; tree_userInfoManaeFolder.add(forwardQueryUserInfoItem); var forwardQueryVIPUserInfoItem=new WebFXTreeItem("查询VIP用户信息"); forwardQueryVIPUserInfoItem.action='

ABAP 树型菜单程序

ABAP 树型菜单程序 Jerry 项目中树型菜单很少用到,但是学会了,也是一种好事。最近,客户方就有一个要求,能够实现特殊的文档管理,包括动态的树型菜单。此文档中,我就介绍如何用ABAP创建一个简单的树型菜单!下面几个步骤只讲创建树型菜单几个重要的地方,最后面是详细的实现代码。建议学者粗略看看步骤,重点看最后的代码,然后自己学着按下面的DEMO写测试程序,直到成功为止,如有不懂的地方,可以到群内留言。或者文档有写得不好的地方,也可以提出来,我们一起加以改善! 一. 创建一个DIALOG屏幕(0900),创建一个定制控制: TREE_CONTAINER,作为一个容器来存放程序创建的 树型菜单,如下图所示: 二. 在屏幕PBO事件中,创建一个MOUDLE: m_init_tree,然后创建一个Subroutine: frm_init_tree。 在Subroutine中创建一个Object: g_application,g_application指向自己创建的一个Class:lcl_application。这个Class主要定义了一些事件,比如单击,双击,展开,链接单击等事件,用来注册及捕获树型菜单的父节点,子节点单击,双击,展开,链接单击等事件,然后在自己Class :lcl_application中相应自定义的Method中写相应的Code,实现特殊的操作。 三. 用程序创建一个容器类cl_gui_custom_container的实例g_custom_container,代码如下 CREATE OBJECT g_custom_container EXPORTING container_name = 'TREE_CONTAINER' EXCEPTIONS cntl_error = 1 cntl_system_error = 2 create_error = 3 lifetime_error = 4 lifetime_dynpro_dynpro_link = 5.

采用HierarchicalDataTemplate数据模板和treeview在MVVM模式下实现行政区划树

摘要:采用HierarchicalDataTemplate数据模板和treeview在MVVM模式下实现行政区划树, 支持勾选。勾选父节点,子节点回全部自动勾选;子节点部分勾选时,父节点半勾选;子节点全部勾选时,父节点勾选。反之亦然。 HierarchicalDataTemplate是分层数据模板,通常用于tree,menu等层级控件。 HierarchicalDataTemplate的ItemsSource属性绑定下一级数据源。 Model为行政区数据实体类,通常访问数据库获取数据并构建对象。 ViewModel为界面的抽象模型,表示界面的数据和行为,是Model和View的桥梁。 view就是界面。 一、代码 1、Model using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;

namespace WpfHierarchicalTemplate { public class District { public int ID { get; set; } public string Xzqhdm { get; set; }//行政区划代码 public string Xzqhmc { get; set; }//行政区划名称 public int Level { get; set; }//级别,0全国,1省,2地市,3县,4,乡镇,5,村 public IList Children { get; set; } public District Parent { get; set; } } } 2、ViewModel using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Collections.ObjectModel; using System.Windows.Media; using System.Windows.Media.Imaging; namespace WpfHierarchicalTemplate { publicclass DistrictNodeViewModel :ModelCommon.NotifyObject { privatebool? isSelected = false; publicbool? IsSelected { get{ return isSelected; } set { isSelected = value; RaisePropertyChanged("IsSelected");

如何制作dvd光盘动态菜单

如何制作dvd光盘动态菜单 在多个视频刻录光盘时,你可以自制精美漂亮的光盘菜单,通过这个菜单,用户可以非常方便的找到自己要播放的视频文件,同时也能让视频光盘更加精彩。那么制作菜单用什么软件最好?小编推荐具有专业水准的狸窝DVD刻录软件,支持DVD菜单制作,满足您全方位的制作要求。用鼠标点几下,你就可以轻松制作菜单了。分享DVD菜单制作教程,光盘菜单制作秘籍,你也赶紧体验一下吧。 准备好:刻录软件、DVD刻录机、空白刻录盘,还有你的刻录文件。就可以开始操作了。打开狸窝刻录光盘软件,点击左上方的“添加视频”,打开浏览文件夹并将需要的视频都导入进来。添加成功后,可以使用视频编辑、视频预览等功能,如图所示,菜鸟刻录DVD方法。 光盘开始菜单设置。如图所示,可以主界面右边进行设置快速选择菜单及预览菜单。在右上方有一个“停用菜单”的按钮(点击停用的话,刻录的光盘播放时会自动播放视频),还有“设计菜单”按钮,点击进入自定义编辑界面,下面要详细说的。

自定义设计菜单(菜单设计器),子菜单的编辑。总编辑选项有主题、背景、按钮、标题、高级选项。以下图文了解一下。 “主题”选项,样式分类为标准、商业、教育、节日、自然、其他、自定义。这个其实在主界面也可以选择的。其中自定义就是我们设计后保存在这里的菜单样式。

“背景”选项,可以设置背景图片和背景音乐(默认已带有一个音乐),其中背景图片的选择有几种:一、可选用系统提供的,二、设计三种颜色的组合图片,三、本地电脑上的图片(gif、png、jpg等格式),四、某一视频中的视频画面。 “按钮”选项,是对视频框架和图标样式的设置,有很多种,在右边编辑相应片选择后,在左边预览区可以看到效果。预览区中的框架是可以用鼠标拖动其位置,和调整其大小的哦。

PowerBuilder动态创建菜单条

动态创建菜单条2008年12月13日星期六1:41本文拟结合powerbuilder语言,简述如何实现动态添加菜单效果。在实际开发过程当中很多时候会因为权限控制的需要,根据用户的不同权限来动态添加菜单项目,如何避免使用繁琐的api函数(如:createmenu、insertmenu、insertmenuitem、appendmenu等),利用powerbuilder语言自身功能达到这一目的呢?本文将就此问题简单予以论述。 一、基本思路 在pb帮助的menu object一节当中,关于其properties描述当中有一项: item[ ] menu specifies the menu objects under a menu object. 这看似简单的一句话其实包含了三层含义: 1、这句话说明menu对象有一个属性为数组类型,它其中的各个元素记录了其所有的具体子item项目,可以借助这个数组中各元素来访问底层的各子菜单; 2、这些子item项目仍是menu类型,因此可以按照第一点的逻辑继续向下层推广,借助该子item的item[]属性可以进而访问其所属下层的第二层子菜单,推而广之,即可全面遍历整个菜单体系的所有子菜单项目; 3、既然该属性是一个数组类型,那么就可以按照数组类型变量来处理,我们可以对其进行upperbound()、lowerbound()等函数操作,还可以进行数组的扩展,即添加新项目,这一点很重要,它是我们整篇文章的核心,如何利用pb实现动态添加菜单,说白了就是添加这个数组元素(读者必须对此有一个清晰的认识),同时期间有一些配套具体的实现技巧,详见下文。 二、具体实现 (一)基本工作 创建一个window窗口和二个menu菜单,其中一个菜单命名为m_main,用作窗口的基本主菜单,新增菜单将在其上添加,该菜单初始可以包含一些基本菜单,如:文件、添加、删除、保存、退出等;另外一个菜单命名为m_new,该菜单只有主菜单一个item,其下没有进一步的子菜单,因此该菜单其实就是一个菜单item。 在主窗口中声明实例变量(instance variables): menu im_new[] //声明一菜单数组用于引用新增菜单 integer ii_count //声明一变量记录总共新增菜单个数 (二)具体代码

数据结构课程设计报告,含菜单

算法与数据结构课程设计 报告 系(院):计算机科学学院 专业班级:计科11005 姓名:张林峰 学号: 201003784 指导教师:詹泽梅 设计时间:2012.6.11 - 2012.6.18 设计地点:12教机房

目录 一、课程设计目的 (2) 二、设计任务及要求 (2) 三、需求分析 (2) 四、总体设计 .............. 错误!未定义书签。 五、详细设计与实现[含代码和实现界面].. 8 六、课程设计小结 (15)

一.设计目的 1.能根据实际问题的具体情况,结合数据结构课程中的基本理论和基本算法,分析并正确确定数据的逻辑结构,合理地选择相应的存储结构,并能设计出解决问题的有效算法。 2.提高程序设计和调试能力。学生通过上机实习,验证自己设计的算法的正确性。学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改。 3.初步掌握软件开发过程中问题分析、系统设计、程序编码、测试等基本方法和技能。 4.训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。 5.培养根据选题需要选择学习书籍,查阅文献资料的自学能力。二.设计任务及要求 根据《算法与数据结构》课程的结构体系,设计一个基于DOS菜单的应用程序。要利用多级菜单实现各种功能。比如,主界面是大项,主要是学过的各章的名字诸如线性表、栈与队列、串与数组及广义表等,子菜单这些章中的节或者子节。要求所有子菜单退出到他的父菜单。编程实现时,要用到C++的面向对象的功能。 三.需求分析 菜单运用极其广泛,应用于各行各业。菜单运用起来极其方便。随着社会的发展,社会的行业出现多样化,也就需要各式

C# 里TreeView绑定数据库实现分类

C# 里TreeView绑定数据库实现分类 分类:导航控件TreeView/Menu/SiteMapPath 2010-03-22 21:33 45人阅读评论(0) 收藏举报 codes=c#] //从数据库中读取数据 SqlConnection con = new SqlConnection("server=127.0.0.1//sqlexpress;uid=sa;"); con.Open(); con.ChangeDatabase("STggggg"); SqlCommand cmd = new SqlCommand("select * from 产品树where NodeType='f'", con); //https://www.360docs.net/doc/1614090270.html,mandType = CommandType.StoredProcedure; SqlDataAdapter sda = new SqlDataAdapter(cmd); DataSet ds = new DataSet(); try { sda.Fill(ds); } catch { } finally { cmd = null; con.Close(); } //往TreeView中添加树节点 //添加根节点 TreeNode tn = new TreeNode(); tn.Text = "所有产品"; https://www.360docs.net/doc/1614090270.html, = "0";//Name作为ID tn.Tag = "0";//Tag作为RootID tn.ImageIndex = 0; tn.SelectedImageIndex = 0; tv.Nodes.Add(tn);//该TreeView命名为tv tv.SelectedNode = tv.TopNode;

MFC 单文档中动态添加菜单项和响应菜单事件

MFC 单文档中动态添加菜单项和响应菜单事件 新建一个单文档程序 在查看菜单项中增加两个子菜单,分别为隐藏工具栏(ID_HIDE),新建菜单(ID_NEWMENU) 在Resource.h中增加一个ID_NEWMENU宏 #define ID_NEWMENU WM_USER+101 操作工具栏和状态栏 使用GetDescendantWindow函数获取工具栏和状态栏的指针为ID_HIDE添加消息映射,编辑代码如下 static bool m_Hide=false; m_Hide=!m_Hide; //获取工具栏指针 CWnd* pWndToolBar=(CWnd*)GetDescendantWindow(AFX_IDW_TOOLBAR); //获取状态栏指针 CWnd* pWndStatusBar=(CWnd*)GetDescendantWindow(AFX_IDW_STATUS_BAR); CMenu* pMenu=GetMenu(); CMenu* pSubMenu=pMenu->GetSubMenu(2); if(m_Hide) { pSubMenu->ModifyMenu(ID_HIDE,MF_BYCOMMAND,ID_HIDE,"显示工具栏"); if(pWndStatusBar!=NULL) pWndStatusBar->SetWindowText("隐藏工具栏"); if(pWndToolBar!=NULL) pWndToolBar->ShowWindow(SW_HIDE); } else { pSubMenu->ModifyMenu(ID_HIDE,MF_BYCOMMAND,ID_HIDE,"隐藏工具栏"); if(pWndStatusBar!=NULL) pWndStatusBar->SetWindowText("显示工具栏"); if(pWndToolBar!=NULL) pWndToolBar->ShowWindow(SW_SHOW); } 动态添加子菜单 为ID_NEWMENU增加消息映射,编辑代码如下 static UINT m_NewMenu=ID_NEWMENU+1; //获取菜单 CMenu* pMenu=GetMenu(); //获取索引为2的菜单项,即第3列菜单 CMenu* pSubMenu=pMenu->GetSubMenu(2); char buffer[1]; itoa(m_NewMenu-ID_NEWMENU,buffer,10); if(m_NewMenu<=ID_NEWMENU+5) { pSubMenu->AppendMenu(MF_SEPARATOR); //分隔线 pSubMenu->AppendMenu(MF_STRING | MF_ENABLED,m_NewMenu++, CString("新的菜单")+buffer); } //如果m_bAutoMenuEnable为true,则会依次检查View、Document、Frame的 //消息映射表是否有这个弹出菜单中每个菜单项的处理函数,澳门新濠天地官网https://www.360docs.net/doc/1614090270.html, 如果没有就会把那一项改为灰的 m_bAutoMenuEnable=false;

菜单树的设计与实现实验报告

一、问题描述 创建table保存具有层次结构的菜单树信息,记录菜单的ID,名称,描述,父菜单(可为空)和可用性(enable/disable),菜单的深度无限制。 二、实验内容及步骤 1.首先以sysdba身份登录数据库,命令为:conn / as sysdba 2.创建用户表空间menu,数据文件为:d:\menu.dbf,大小20M,相关命令如下: create tablespace menu datafile 'd:\menu.dbf' size 20M; 3.创建新用户yjmin,默认表空间为新创建的menu表空间,相关命令如下: create user yjmin identified by yjmin default tablespace menu; 4.为新创建用户yjmin授权connect和resource角色; 5.以新创建的用户yjmin登录数据库,命令为:conn yjmin/yjmin; 6.创建序列,自动生成菜单ID,相关命令如下: create sequence id_seq start with 1 increment by 1; 7.创建表menu_tab保存菜单信息: create table menu_tab (id number primary key, name varchar2(50) not null, description varchar2(200), parent_menu varchar2(50), available varchar2(10) not null); 8.向表menu_tab中插入菜单数据,以示例数据插入,并提交插入的数据。 9.打开PL/SQL输出信息,命令为:set serveroutput on; 10.创建函数获取菜单ID: create or replace function get_menu_id (v_name varchar2) return number as

VB控件 treeview用法详解

VB TreeView控件使用详解 (2012-06-16 15:08:16) 标签:分类: 第一小时:学习直接用代码将数据填充到树控件中。 为什么要先学习直接用代码将数据填充到树控件中因为这种方法是最简单的,代码也最容易理解,学习树控件,先将这个学会,已经掌握了一半,所以先不要急着想怎么将表中的数据填充到树控件中,在第一小时里,树控件和表完全没有关系。 目的:我们要在树控件中建立如下的一个3层级关系 水果 | |__苹果 | |__红富士 | |__国光 | |__葡萄 |__红提子 |__青提子 解释:水果包含2种,一种是苹果,一种是葡萄,苹果又包含2种,一种是红富士,一种是国光,葡萄也如此。 在这里:“爷”是水果,“父”是苹果,葡萄,“子”是红富士,国光,红提子,青提子。概括如下: 爷(只能有一个):水果 父(这里有2个):父1:苹果;父2:葡萄

子(这里有4个):子1:红富士(父1苹果的子);子2:国光(父1苹果的子);子3:红提子(父2葡萄的子);子4:青提子(父2葡萄的子) 1、新建一个窗体,在窗体上放置两个控件,一个是Treeview,一个是Imagelist 如何找到这两个控件 Treeview控件在“工具箱”的榔头加扳手图标(其他控件)中选“Microsoft Treeview Control,Version " Imagelist控件在“工具箱”的榔头加扳手图标(其他控件)中选“Microsoft Imagelist Control,Version " Treeview控件大家都明白干什么用的,Imagelist控件是干什么用呢原来这个控件是放图标用的,如果你想在树控件中显示图标的,这个图标都将储存在ImageList控件中。 2、设置这两个控件的属性 首先要讲清楚控件的属性设置有2种,一种是设置这个控件在ACCESS中的属性,比如名称等。一种是设置这个控件本身的属性。要设置这个控件在ACCESS中的属性,选中控件后按鼠标右键选“属性”就可以了。跟我们平时设置文本框什么的一样。要设置这个控件本身的属性,只要双击这个控件就可以了。 1)设置Treeview控件在ACCESS中的名称属性,将名称设置为“Treeview" 2)设置Imagelist控件在ACCESS中的名称属性,将名称设置为“Image" 2)设置Imagelist控件本身的属性,双击控件后,在弹出来的设置框中选“Images",单击“Insert Picture"按钮,在你电脑中选择你需要的图标。在“Key:”栏中填入“K1”。其他默认设置不用改。3)设置Treeview控件本身的属性,双击控件后,在弹出来的设置框中选“General”,在这个选项面版中有很多项设置,大多数是设置树控件的显示格式,你自己慢慢研究。这里我们将第一项“Style"选7,在第五项“Imagelist"选项中将我们放置的Imagelist控件“Image"选上。这项设置就将图标和树控件联系了起来。 3、写代码将数据填充到树控件中

C#动态创建菜单

C#动态创建菜单 一、加入所需数据 1、创建数据表: create table t_SysMenu( FMenuName varchar(50) not null , FMenuText varchar(50) not null , FMenuEvent varchar(100) , FMenuShortcutKeys varchar(50) null, FMenuIcon int default 0, FMenuSequence int default 0, FParentNo varchar(21) not null , FStatus char(1) default '1',--- FFlag char(1) default '1',--- FCreateDate datetime default getdate() , FCreator varchar(20) null , FModifyDate datetime default getdate() , FModifier varchar(20) null , FMemo text null , constraint PK_t_SysMenu primary key(FMenuName) ) go 2、插入数据: MenuItemBase 基础资料(&B) NULL NULL 0 MenuItemBase_01 系统代码 MenuItemBase_01_Click NULL MenuItemBase MenuItemHelp 帮助(&H) NULL NULL 0 MenuItemHelp_About 关于(&A) MenuItemHelp_About_Click NULL MenuItemHelp MenuItemHelp_Cat 目录(&C) NULL F1 MenuItemHelp 二、新建项目-> Windows 用应用程序 1、界面如图aa: 拖入一菜单项MenuStrip并命名为sysMenu 2、代码段: using System; using System.Collections.Generic; using https://www.360docs.net/doc/1614090270.html,ponentModel; using System.Data;

动态添加菜单项、子菜单、右键菜单 VC

动态添加菜单项、子菜单、右键菜单 VC 动态添加菜单项、子菜单、右键菜单(VC)2010-06-27 16:56如何动态添加菜单/菜单项、子菜单、右键菜单 有关菜单的操作主要用到CMenu类,当然也可用相应API函数,CMenu类只是MFC对API中操作菜单的函数的封装而已。不过能用类就尽量用类,类的组织方式好呗,代码看着也舒服。若是SDK编程,那就用API吧。 CMenu menuMain,menu1;//首先定义CMenu对象 一、创建菜单,有两种方法 1.用LoadMenu函数从资源加载 menuMain.LoadMenu(IDR_MAINFRAME);//从资源加载,这里使用SDI的主菜单资源 2.用CreateMenu函数创建 menu1.CreateMenu();//创建菜单,还没有菜单项 二、添加菜单项,可用AppendMenu()在菜单的最后加、InsertMenu()在指定的位置加. //ID_TEST1在Resource.h中定义,随便给个整数值,不要和已有的重复就行了 menu1.AppendMenu(MF_STRING,ID_TEST1,"Test1");//第一项菜单项 menu1.AppendMenu(MF_STRING,ID_TEST2,"Test2");//第二项菜单项 menu1.InsertMenu(1,MF_BYPOSITION|MF_STRING,

(UINT)ID_TEST1,"ID_TEST1");//在第二项菜单项前添加新菜单项 三、添加子菜单 同样用AppendMenu()、InsertMenu()函数。不过要注意参数的设置。 menu1.AppendMenu(MF_BYPOSITION|MF_POPUP|MF_STRING, (UINT)menuMain.GetSubMenu(0)-m_hMenu,"子菜单"); //第二个参数是菜单的句柄HMENU 四、删除菜单 用DeleteMenu()、RemoveMenu()函数来删除指定位置的菜单/菜单项。 两者区别:如果菜单项是一个弹出式菜单,那么DeleteMenu和RemoveMenu之间的区别就很重要。DeleteMenu清除弹出式菜单,但RemoveMenu不清除它。一个是彻底的删除,一个只是移除. MSDN:1.The DeleteMenu function destroys the handle to the menu or submenu and frees the memory used by the menu or submenu.它使菜单或者子菜单的handle无效(destroys)。2.RemoveMenu does not destroy the menu or its handle,allowing the menu to be reused.可以再利用,并不从内存中将menu删除。 五、添加右键菜单 CMenu menu1; menu1.CreatePopupMenu();//动态创建弹出式菜单对象 menu1.AppendMenu(MF_STRING,ID_TEST1,"菜单项1"); menu1.AppendMenu(MF_STRING,ID_TEST2,"菜单项2"); menu1.InsertMenu(2,MF_BYPOSITION|MF_POPUP|MF_STRING,

vb TreeView 控件应用实例

vb TreeView 控件应用实例 2009-11-14 20:52 TreeView 控件应用实例:将 TreeView 绑定到 Biblio.mdb 数据库 应用示例:DataTree.vbp 本章的代码示例是从应用示例 DataTree.vbp which is listed in the Samples directory 中得到的。 可将数据库中的数据绑定到 TreeView 控件。下面的示例将 TreeView 控件绑定到 Biblio 数据库,该数据库可以在 Visual Basic CD 中找到。该应用实例将 Publishers 表作为树节点的第一层。如果一个出版商对应于一个或多个书名,则这些书名将作为该出版商的子节点加入树中。 图 2.42 与数据绑定的 TreeVew 控件 下面的代码用到了如下对象: Data Access Object Library(3.5) 名为“frmDataTree”的 Form 对象 名为“tvwDB”的 TreeView 控件 名为“cmdLoad”的 CommandButton 控件 将 Biblio.mdb 数据库绑定到 TreeView 控件 在工程中添加对数据访问对象(DAO 3.0)的引用。 为 Database 和 Node 对象创建模块级的变量。 在 Form Load 事件中,用 OpenDatabase 语句将 Database 对象变量设置为 Biblio 数据库。 用 Nodes 集合的 Add 方法创建顶层的节点对象。 在 CommandButton 的 Click 事件中,创建两个 Recordset 变量,并将它们设置为Publishers 和 Titles 表。

树形菜单的实现.doc

JSP树形菜单的实现(转载) (2009-04-20 15:21:03) 转载 标签: 分类:技术讲解 杂谈 1。原理简介 dtree是一个免费的javascript脚本,只需定义有限的几个参数,就可以做出漂亮的树型菜单。下载目录:https://www.360docs.net/doc/1614090270.html,/javascripts/tree/ 以下是dtree的用法示例: 1)初始化菜单 显然,如果用动态的脚本来初始化菜单数组(asp,jsp均可),那就可以很方便的实现动态的树型菜单了。

2。jsp动态实现 分以下步骤实现动态的树型菜单: 1)在数据库建tree_info表,有nodeId,parentNodeId,nodeName,nodeUrl四个字段,来存储节点信息。 2)编写java类,用于从数据库找出节点信息,并且生成javascript脚本。 3)编写tag类。用于封装逻辑,简化jsp的开发。 4)建一个web程序进行测试。 3。详细过程 1)在数据库建表,脚本如下: CREATE TABLE `test`.`tree_info` ( `node_id` INTEGER UNSIGNED NOT NULL DEFAULT -1, `parent_id` INTEGER UNSIGNED NOT NULL DEFAULT -1, `node_name` VARCHAR(45) NOT NULL, `ref_url` VARCHAR(45) NOT NULL, PRIMARY KEY(`node_id`) ) 我使用mysql数据库,如果脚本细节有出入,请自行修改 按照上面的dTree示例插入数据 2)编写TreeInfo.java,这个类用于封装节点信息 package com.diegoyun.web.tree; public class TreeInfo { private int nodeId = -1;//node id private int parentId = -1;//parentId private String nodeName = null;//node name private String url = null;//url references