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控件 ...
随机推荐
- RabbitMQ for Mac OS Install
使用brew来安装 RabbitMQ brew install rabbitmq 执行看到如下命令: Updating Homebrew... ==> Auto-updated Homebrew ...
- 对css盒模型的理解
介绍一下标准css的盒子模型?低版本IE的盒子模型有什么不同的? 1.有两种:IE盒子模型(怪异模式).W3c盒子模型(标准模式). 2.盒模型组成:内容(content).内边距(padding). ...
- Django-0-环境搭建、创建项目、启动服务
1- 创建虚拟环境名称(在虚拟机中) mkvirtualenv -p /usr/bin/python3 envname (/usr/bin/python3 - 你自己在虚拟机中的Python解释器 ...
- python学习——读取染色体长度(二、向前一步:通过染色体序列获得长度信息)
# 读取fasta # 解析每条序列的长度 chr1_seq = 'ATATATATAT' chr2_seq = 'ATATATATATCGCGCGCGCG' chr3_seq = 'ATATATAT ...
- LINQ 之 GroupBy
声明:本文为www.cnc6.cn原创,转载时请注明出处,谢谢! 本文作者文采欠佳,文字表达等方面不是很好,但实际的代码例子是非常实用的,请作参考. 一.先准备要使用的类: 1.Person类: cl ...
- 启用shopt 选项实现不使用 CD 命令进入目录/文件夹
众所周知,如果没有 cd 命令,我们无法 Linux 中切换目录.这个没错,但我们有一个名为 shopt 的 Linux 内置命令能帮助我们解决这个问题. shopt 是一个 shell 内置命令,用 ...
- Go 目录
Go语言 go语言初识 基本数据类型和操作符 字符串,时间,流程控制,函数 GOROOT,GOPATH,GOBIN,project目录 数组和切片 指针和内置函数 排序和查找 map
- [转帖]Windows 上面IE的历史
微软向Chrome举手投降 这么多代IE你都用过吗 2019年04月20日 18:48 4030 次阅读 稿源:太平洋电脑网 2 条评论 这个清明假节,很多人过得波澜不惊,然而一个曾被万千网民挂在口中 ...
- elasticsearch补全功能之只补全筛选后的部分数据context suggester
官方文档https://www.elastic.co/guide/en/elasticsearch/reference/5.0/suggester-context.html 下面所有演示基于elast ...
- 详解TCP三次握手
该文pdf下载地址:三次握手.pdf