提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
原创|其它|编辑:郝浩|2011-06-17 11:47:34.000|阅读 16765 次
概述:工作中经常用的的是第三发控件DevExpress,相信大家都知道它的强大功能,这次用到了TreeList做了一个权限的管理,发现TreeList非常好用,大家可以看它自带的 Demo就知道了
# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>
工作中经常用的的是第三发控件DevExpress,相信大家都知道它的强大功能,这次用到了TreeList做了一个权限的管理,发现TreeList非常好用,大家可以看它自带的 Demo就知道了,功能很多,这里我就把我用到的说出来,大家一起交流学习。
TreeList有一个KeyFieldName和ParentFieldName,这2个非常重要,只要构造一个DataTable赋值给 TreeList的DataSource,这个DataTable里面要有2列是必须的,因为这2列要赋给上面说的KeyFieldName和 ParentFieldName,先不说上面意思,树应该是从根节点递归、递归、一直往下递归到叶子,KeyFieldName和 ParentFieldName就起到这个作用,比如:下面的一个DataTable:
KeyFieldName | ParentFieldName | NodeName | NodeCode | Others |
1 | Null | 根节点1名称 | 根节点1编码 | 其他 |
2 | 1 | 节点1子节点名称 | 节点1子节点编码 | 其他 |
3 | 1 | 节点1子节点名称 | 节点1子节点编码 | 其他 |
4 | Null | 根节点4名称 | 根节点4编码 | 其他 |
5 | 4 | 节点4子节点名称 | 节点4子节点编码 | 其他 |
6 | 5 | 节点5子节点名称 | 节点5子节点编码 | 其他 |
这时,如果把这个DataTable赋给TreeList的话,就会产生下面的一棵树:
下面是一个构造TreeList的数据源的简单示例:
/// <summary> /// 构造一棵树型表结构 /// </summary> /// <returns></returns> private DataTable CreateTreeListTable() { DataTable dt = new DataTable(); DataColumn dcOID = new DataColumn("KeyFieldName", Type.GetType("System.Int32")); DataColumn dcParentOID = new DataColumn("ParentFieldName", Type.GetType("System.Int32")); DataColumn dcNodeName = new DataColumn("NodeName", Type.GetType("System.String")); DataColumn dcNodeCode = new DataColumn("NodeCode", Type.GetType("System.String")); DataColumn dcOthers = new DataColumn("Others", Type.GetType("System.String")); dt.Columns.Add(dcOID); dt.Columns.Add(dcParentOID); dt.Columns.Add(dcNodeName); dt.Columns.Add(dcNodeCode); dt.Columns.Add(dcOthers); //以上代码完成了DataTable的构架,但是里面是没有任何数据的 DataRow dr1 = dt.NewRow(); dr1["KeyFieldName"] = 1; dr1["ParentFieldName"] = DBNull.Value; dr1["NodeName"] = "根节点名称"; dr1["NodeCode"] = "根节点编码"; dr1["Others"] = "其他"; dt.Rows.Add(dr1); DataRow dr2 = dt.NewRow(); dr2["KeyFieldName"] = 2; dr2["ParentFieldName"] = 1; dr2["NodeName"] = "节点子节点名称"; dr2["NodeCode"] = "节点子节点编码"; dr2["Others"] = "其他"; dt.Rows.Add(dr2); DataRow dr3 = dt.NewRow(); dr3["KeyFieldName"] = 3; dr3["ParentFieldName"] = 1; dr3["NodeName"] = "节点子节点名称"; dr3["NodeCode"] = "节点子节点编码"; dr3["Others"] = "其他"; dt.Rows.Add(dr3); DataRow dr4 = dt.NewRow(); dr4["KeyFieldName"] = 4; dr4["ParentFieldName"] = DBNull.Value; dr4["NodeName"] = "根节点名称"; dr4["NodeCode"] = "根节点编码"; dr4["Others"] = "其他"; dt.Rows.Add(dr4); DataRow dr5 = dt.NewRow(); dr5["KeyFieldName"] = 5; dr5["ParentFieldName"] = 4; dr5["NodeName"] = "节点子节点名称"; dr5["NodeCode"] = "节点子节点编码"; dr5["Others"] = "其他"; dt.Rows.Add(dr5); DataRow dr6 = dt.NewRow(); dr6["KeyFieldName"] = 6; dr6["ParentFieldName"] = 5; dr6["NodeName"] = "节点子节点名称"; dr6["NodeCode"] = "节点子节点编码"; dr6["Others"] = "其他"; dt.Rows.Add(dr6); return dt; }
好了,一个TreeList构造完成,下面就是TreeList的一些常用用法,都比较简单,这里就直接上代码了,代码中有简单的注释,大家一看就明白哦。
/// <summary> /// 点击节点前 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void treeLstModuleAction_BeforeCheckNode(object sender, DevExpress.XtraTreeList.CheckNodeEventArgs e) { e.State = (e.PrevState == CheckState.Checked ? CheckState.Unchecked : CheckState.Checked); } /// <summary> /// 点击节点后 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void treeLstModuleAction_AfterCheckNode(object sender, DevExpress.XtraTreeList.NodeEventArgs e) { SetCheckedChildNodes(e.Node, e.Node.CheckState); SetCheckedParentNodes(e.Node, e.Node.CheckState); } /// <summary> /// 选择子节点时触发 /// </summary> /// <param name="node"></param> /// <param name="check"></param> private void SetCheckedChildNodes(TreeListNode node, CheckState check) { for (int i = 0; i < node.Nodes.Count; i++) { node.Nodes[i].CheckState = check; SetCheckedChildNodes(node.Nodes[i], check); } } /// <summary> /// 选择父节点时触发 /// </summary> /// <param name="node"></param> /// <param name="check"></param> private void SetCheckedParentNodes(TreeListNode node, CheckState check) { if (node.ParentNode != null) { bool b = false; CheckState state; for (int i = 0; i < node.ParentNode.Nodes.Count; i++) { state = (CheckState)node.ParentNode.Nodes[i].CheckState; if (!check.Equals(state)) { b = !b; break; } } node.ParentNode.CheckState = b ? CheckState.Indeterminate : check; SetCheckedParentNodes(node.ParentNode, check); } } /// <summary> /// 判断此节点下的所有孩子节点是否选中 /// </summary> /// <param name="node"></param> /// <returns></returns> private Boolean IsChildsChecked(TreeListNode node) { for (int i = 0; i < node.Nodes.Count; i++) { if (node.Nodes[i].CheckState == CheckState.Unchecked) return false; if (node.Nodes[i].HasChildren) IsChildsChecked(node.Nodes[i]); } return true; }
好了,至此,关于TreeList的一些常用用法就说到这了,大家如果有好的想法,请不吝赐教,谢谢!
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn
文章转载自:网络转载面对“数字中国”建设和中国制造2025战略实施的机遇期,中车信息公司紧跟时代的步伐,以“集约化、专业化、标准化、精益化、一体化、平台化”为工作目标,大力推进信息服务、工业软件等核心产品及业务的发展。在慧都3D解决方案的实施下,清软英泰建成了多模型来源的综合轻量化显示平台、实现文件不失真的百倍压缩比、针对模型中的大模型文件,在展示平台上进行流畅展示,提升工作效率,优化了使用体验。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@pclwef.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢