使用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的更多相关文章

  1. Dev控件treeList

    之前做过一段时间,当时copy 的别人的代码,这就就把节点给添加了,上次帮同事做也发现了这个问题,当时没有记下来,今天有做,磨了半天,记下来吧. Dev控件treeList 要添加节点第一步是右键添加 ...

  2. dev 控件的treelist

    最近项目中要求用dev 控件的treelist 树形控件. 如下图 要求如下: 1:选择父节点后,子节点全部打钩: 2:选择子节点而不选择父节点,则从当前节点的父节点一直到根节点check框都是半选状 ...

  3. Dev控件GridView单元格绑定控件

    Dev控件GridView单元格绑定控件 //文本按钮 RepositoryItemButtonEdit btnFields = new RepositoryItemButtonEdit();//创建 ...

  4. DEV控件中GridView中的复选框与CheckBox实现联动的全选功能

    最初的界面图如图1-1(全选框ID: cb_checkall  DEV控件名称:gcCon ): 要实现的功能如下图(1-2  1-3  1-4)及代码所示: 图1-2 图1-3 图1-4 O(∩_∩ ...

  5. DEV控件Grid显示行号

    DEV控件Grid的显示行号需要通过一个事件来设置,具体设置代码为: private void gridView1_CustomDrawRowIndicator(object sender, DevE ...

  6. DevExpress ASP.NET 使用经验谈(9)-Dev控件客户端事件 ClientSideEvents

    上一节,已经介绍了ASPxGridView的自定义列和基本事件 ,本节接着将介绍Dev控件的客户端事件模型. 在上节示例基础上,我们增加一行菜单,使用Dev的ASPxMenu来实现,如下图所示. 图一 ...

  7. DEV控件的Gridview1

    DEV控件的Gridview小技巧总结 1.设置Gridview控件的某列不可编辑 this.gridData.gridView1.Columns["change_date"].O ...

  8. dev控件 xtraTabbedMdiManager 如何将关闭子窗体改为收回主窗体内

    前言 本文主要讲解 xtraTabbedMdiManager 如何将关闭子窗体改为收回主窗体内,顺便附上Float(浮动)的时候使窗体最大化,及指定只能某一个子窗体能浮动放大. 下面进入正题. 一.首 ...

  9. DevExpress Cpicturebox或者Dev控件 PictureEdit 按比例的缩放加载图片

    方法一:     如果要加载的图片的长宽比不是太过失衡, 1.可以改变picturebox的SizeMode属性为 PictureBoxSizeMode.StretchImage, 2.或者Dev控件 ...

随机推荐

  1. Android为TV端助力:UDP协议(接收组播和单播)

    private static String MulticastHost="224.9.9.98";private static int POST=19999;private sta ...

  2. 解决laravel Class 'Doctrine\DBAL\Driver\PDOMySql\Driver' not found 错误

    这个错误的原因来自于没有安装一个依赖库: 官方文档说明如下: Modifying Columns Prerequisites Before modifying a column, be sure to ...

  3. Java:配置环境(Mac)——MySQL

    1.官网下载 2.双击开始安装,一直下一步 用旧版的密码加密 自己写个密码,最少8位 3.测试 打开系统偏好设置 4.mysql需要在系统环境变量里 1)在终端输入mysql,没有指令说明.此时就还不 ...

  4. Python第十四天 序列化 pickle模块 cPickle模块 JSON模块 API的两种格式

    Python第十四天 序列化  pickle模块  cPickle模块  JSON模块  API的两种格式 目录 Pycharm使用技巧(转载) Python第一天  安装  shell  文件 Py ...

  5. qt5.11.2+vs2017环境下opencv3.4.1编译配置

    OpenCV是一个开源的计算机库,它可以帮助视觉工作者做很多富有创造性的工作,在图像处理领域扮演着重要的角色.由于opencv3.x的存在,不管你是学生还是研究人员,是专家还是初学者,都可以快速的建立 ...

  6. java邮箱发送

    一.为何要使用邮箱发送 相信大家在日常工作生活中少不了和邮件打交道,比如我们会用邮件进行信息交流,向上级汇报日常工作:邮件发送的原理是什么?邮件是如何发送的呢?本系列教程将会讲解邮件如何申请可用jav ...

  7. html&css学习笔记----YJZJZQA

    HTML表单: (

  8. Storm入门(四)WordCount示例

    一.关联代码 使用maven,代码如下. pom.xml  和Storm入门(三)HelloWorld示例相同 RandomSentenceSpout.java /** * Licensed to t ...

  9. Hybrid App—Hybrid App开发模式介绍和各种开发模式对比

    什么是Hybrid App 最开的App开发只有原生开发这个概念,但自从H5广泛流行后,一种效率更高的开发模式Hybrid应运而生,它就是"Hybrid模式".Hybrid APP ...

  10. nginx 常见正则匹配符号表示

    1.^: 匹配字符串的开始位置: 2. $:匹配字符串的结束位置: 3..*: .匹配任意字符,*匹配数量0到正无穷: 4.\. 斜杠用来转义,\.匹配 . 特殊使用方法,记住记性了: 5.(值1|值 ...