DEV 控件使用之:TreeList
使用DEV控件也有一段时间了,一直想写点东西。最近又使用到TreeList控件,这个控件对于刚使用的人来说确实不好掌握。我想把自己知道的写下来,让还不熟悉的慢慢学会使用,对于会使用的大家交流下。如果有用的不正确或不恰当的欢迎各位指正批评。
一,第一步从控件库里拖出TreeList
二,设置属性
this.treeList1.OptionsView.ShowCheckBoxes = true;
this.treeList1.OptionsView.ShowColumns = false;
this.treeList1.OptionsView.ShowHorzLines = false;
this.treeList1.OptionsView.ShowIndicator = false;
this.treeList1.OptionsView.ShowVertLines = false;
三,构造测试数据(参考方法 FrmTreeList_Load)
四,设置选中项(参考方法 SetCheckState )
五,当前操作的节点为某个节点的最后一个子节点时,设置父节点的状态
这里需要一个 事件即:treeList1_AfterCheckNode 这个方法在属性事件里找到。
页面所有代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using DevExpress.XtraTreeList.Nodes; namespace WinForm2
{
public partial class FrmTreeList : DevExpress.XtraEditors.XtraForm
{
public FrmTreeList()
{
InitializeComponent();
} private DataTable dt = new DataTable();
/// <summary>
/// 要被选中的节点
/// </summary>
public List<string> SelectItem = new List<string>(); //初始化方法加载测试数据
private void FrmTreeList_Load(object sender, EventArgs e)
{
dt.Columns.Add("ID", typeof(int));
dt.Columns.Add("ItemName", typeof(string));
dt.Columns.Add("ParentID", typeof(int)); DataRow dr = dt.NewRow();
dr["ID"] = ;
dr["ItemName"] = "根节点";
dr["ParentID"] = -;
dt.Rows.Add(dr); DataRow dr2 = dt.NewRow();
dr2["Id"] = ;
dr2["ItemName"] = "根节点2";
dr2["ParentID"] = ;
dt.Rows.Add(dr2); DataRow dr3 = dt.NewRow();
dr3["ID"] = ;
dr3["ItemName"] = "根节点3";
dr3["ParentID"] = ;
dt.Rows.Add(dr3); DataRow dr4 = dt.NewRow();
dr4["ID"] = ;
dr4["ItemName"] = "子节点1";
dr4["ParentID"] = ;
dt.Rows.Add(dr4); DataRow dr5 = dt.NewRow();
dr5["ID"] = ;
dr5["ItemName"] = "子节点2";
dr5["ParentID"] = ;
dt.Rows.Add(dr5); DataRow dr6 = dt.NewRow();
dr6["ID"] = ;
dr6["ItemName"] = "子子节点1";
dr6["ParentID"] = ;
dt.Rows.Add(dr6); DataRow dr7 = dt.NewRow();
dr7["ID"] = ;
dr7["ItemName"] = "子子节点2";
dr7["ParentID"] = ;
dt.Rows.Add(dr7); this.treeList1.DataSource = dt;
this.treeList1.KeyFieldName = "ID";
this.treeList1.ParentFieldName = "ParentID"; //这里是用来测试的节点
SelectItem.Add("子子节点1");
SelectItem.Add("根节点2");
// 设置初始状态
SetCheckState(SelectItem, "ItemName"); } #region 按配置选中相关节点项 //设置节点的选中状态
private void SetCheckState(List<string> list, string fieldName)
{
foreach (TreeListNode n in treeList1.Nodes)
{
DataRowView drv = (DataRowView)treeList1.GetDataRecordByNode(n);
string nodeName = (drv != null && drv[fieldName] != null) ? Convert.ToString(drv[fieldName]) : string.Empty;
if (list.Contains(nodeName))
{
n.CheckState = CheckState.Checked;
}
//如果当前结点有子结点,再枚举所有子结点
if (n.HasChildren)
this.SelectedChildNode(n, fieldName);
} } /// <summary>
/// 设置子节点状态
/// </summary>
/// <param name="parentNode"></param>
private void SelectedChildNode(TreeListNode parentNode, string fieldName)
{
foreach (TreeListNode n in parentNode.Nodes)
{
DataRowView drv = (DataRowView)treeList1.GetDataRecordByNode(n);
string nodeName = (drv != null && drv[fieldName] != null) ? Convert.ToString(drv[fieldName]) : string.Empty;
if (SelectItem.Contains(nodeName))
{
n.CheckState = CheckState.Checked;
// 这里是将父节点,父节点的父节点设置为选中状态
SelectedParentNode(n);
}
if (n.HasChildren) this.SelectedChildNode(n, fieldName);
}
} /// <summary>
/// 设置相关的父节点被选中
/// </summary>
/// <param name="parentNode"></param>
private void SelectedParentNode(TreeListNode parentNode)
{
if (parentNode.ParentNode != null)
{
parentNode.ParentNode.CheckState = CheckState.Checked;
SelectedParentNode(parentNode.ParentNode);
}
} #endregion #region 节点选中或取消相关处理 //节点选中后处理
private void treeList1_AfterCheckNode(object sender, DevExpress.XtraTreeList.NodeEventArgs e)
{
SetChildNodeState(e.Node, e.Node.CheckState);
SetParentNodeState(e.Node);
} //设置子节点的状态(当选中父节点时所有的子节点也要选中)
private void SetChildNodeState(TreeListNode node, CheckState state)
{ if (node.HasChildren)
{
foreach (TreeListNode item in node.Nodes)
{
item.CheckState = state;
if (item.HasChildren) SetChildNodeState(item, state);
}
}
} //检查节点是否是最后一个被选中或取消的子节点,如果是要对父节点进行设置(选中或不选中)
private void SetParentNodeState(TreeListNode node)
{
if (node.ParentNode != null)
{
// 方法一
//bool state = false;
//foreach (TreeListNode item in node.ParentNode.Nodes)
//{
// state = item.Checked;
// if (state) break;
//}
//node.ParentNode.Checked = state; // 方法二
bool state = true;
node.ParentNode.CheckState = CheckState.Checked;
foreach (TreeListNode item in node.ParentNode.Nodes)
{
if (item.CheckState != node.CheckState)
{
state = false;
break;
}
}
if (state) node.ParentNode.CheckState = node.CheckState; // 递归检查父父节点
SetParentNodeState(node.ParentNode);
}
} #endregion // 设置选中项的背景
private void treeList1_CustomDrawNodeCell(object sender, DevExpress.XtraTreeList.CustomDrawNodeCellEventArgs e)
{
if (e.Node.Checked)
{
e.Appearance.BackColor = Color.LightBlue;
}
else
{
e.Appearance.BackColor = Color.Transparent;
}
}
}
}
DEV 控件使用之:TreeList的更多相关文章
- Dev控件treeList
之前做过一段时间,当时copy 的别人的代码,这就就把节点给添加了,上次帮同事做也发现了这个问题,当时没有记下来,今天有做,磨了半天,记下来吧. Dev控件treeList 要添加节点第一步是右键添加 ...
- dev 控件的treelist
最近项目中要求用dev 控件的treelist 树形控件. 如下图 要求如下: 1:选择父节点后,子节点全部打钩: 2:选择子节点而不选择父节点,则从当前节点的父节点一直到根节点check框都是半选状 ...
- Dev控件GridView单元格绑定控件
Dev控件GridView单元格绑定控件 //文本按钮 RepositoryItemButtonEdit btnFields = new RepositoryItemButtonEdit();//创建 ...
- DEV控件中GridView中的复选框与CheckBox实现联动的全选功能
最初的界面图如图1-1(全选框ID: cb_checkall DEV控件名称:gcCon ): 要实现的功能如下图(1-2 1-3 1-4)及代码所示: 图1-2 图1-3 图1-4 O(∩_∩ ...
- DEV控件Grid显示行号
DEV控件Grid的显示行号需要通过一个事件来设置,具体设置代码为: private void gridView1_CustomDrawRowIndicator(object sender, DevE ...
- DevExpress ASP.NET 使用经验谈(9)-Dev控件客户端事件 ClientSideEvents
上一节,已经介绍了ASPxGridView的自定义列和基本事件 ,本节接着将介绍Dev控件的客户端事件模型. 在上节示例基础上,我们增加一行菜单,使用Dev的ASPxMenu来实现,如下图所示. 图一 ...
- DEV控件的Gridview1
DEV控件的Gridview小技巧总结 1.设置Gridview控件的某列不可编辑 this.gridData.gridView1.Columns["change_date"].O ...
- dev控件 xtraTabbedMdiManager 如何将关闭子窗体改为收回主窗体内
前言 本文主要讲解 xtraTabbedMdiManager 如何将关闭子窗体改为收回主窗体内,顺便附上Float(浮动)的时候使窗体最大化,及指定只能某一个子窗体能浮动放大. 下面进入正题. 一.首 ...
- DevExpress Cpicturebox或者Dev控件 PictureEdit 按比例的缩放加载图片
方法一: 如果要加载的图片的长宽比不是太过失衡, 1.可以改变picturebox的SizeMode属性为 PictureBoxSizeMode.StretchImage, 2.或者Dev控件 ...
随机推荐
- Redis入门教程(一)
一.NoSQL概述 1.什么是NoSQL NoSQL,泛指非关系型的数据库.随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯 ...
- .net core 命令行(仅作记录)
命令大全:dotnet 命令 创建NuGet包:如何使用 .NET Core 命令行接口 (CLI) 工具创建 NuGet 包
- Windows 10 远程连接出现函数错误 【这可能由于CredSSP加密Oracle修正】
win+R 弹出窗口输入gpedit.msc 计算机配置=>管理模板=>系统=>凭据分配=>加密Oracle修正 编辑策略设置=>已启用=>保护级别=>易受攻 ...
- arts打卡 从排序数组中删除重复项
Algorithm 从排序数组中删除重复项 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组 ...
- timers模块
timers模块 var timers = require('timers'); function A() { //将A对象注册到定时器里 timers.enroll(); //进行激活,如果不激活, ...
- 随机数据生成与对拍【c++版,良心讲解】
10.7更新:见最下面 离NOIP2018没剩多长时间了,我突然发现我连对拍还不会,于是赶紧到网上找资料,找了半天发现了一个特别妙的程序,用c++写的! 不过先讲讲随机数据生成吧. 很简单,就是写一个 ...
- 【转】不需要 Root,也能用上强大的 Xposed 框架:VirtualXposed
如果你喜欢折腾 Android 设备,那么你应该对 Xposed 的大名有所耳闻. 这个第三方框架,让许多 Android 玩家都爱不释手.通过对系统框架的「偷天换日」,它可以修改系统与应用的各种数据 ...
- 关于Math.round()方法
先上结论: 1.参数的小数点后第一位<5,运算结果为参数整数部分. 2.参数的小数点后第一位>5,运算结果为参数整数部分绝对值+1,符号(+ or -)不变. 3.参数的小数点后第一位=5 ...
- nextInt()和nextLine()一起使用时的注意点
问题原因:nextLine()会把nextInt(),next(),nextDouble(),nextFloat()的结束换行符作为字符串读入,进而不需要从键盘输入字符串nextLine便已经转向了下 ...
- [Alpha阶段]项目展示博客
目录 Alpha阶段项目展示 1.团队成员介绍 2.工程相关信息 (1)我们的用户 (2)产品表现 (3)团队分工 (4)项目管理 (5)测试 (6)文档 (7)用户调研 3.项目信息 (1)实际进展 ...