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控件 ...
随机推荐
- RecycleView的notifyItemRemoved使用注意
转载请标明出处,维权必究:https://www.cnblogs.com/tangZH/p/10116095.html 我们为了移除RecycleView的某一项,会用RecycleView的noti ...
- log4net使用封装,无缝切换 dotnet 和 dotnetcore
log4net使用封装,无缝切换 dotnet 和 dotnetcore Intro 自己有几个自己的小项目,有许多公用的方法/扩展/工具类等等,于是封装了一些常用的工具类/扩展方法 WeihanLi ...
- springCloud feign使用/优化总结
基于springCloud Dalston.SR3版本 1.当接口参数是多个的时候 需要指定@RequestParam 中的value来明确一下. /** * 用户互扫 * @param uid 被扫 ...
- Scala操作Hbase空指针异常java.lang.NullPointerException处理
Hbase版本:Hortonworks Hbase 1.1.2 问题描述:使用Scala操作Hbase时,发生空指针异常(java.lang.RuntimeException: java.lang.N ...
- Elastic Stack-Elasticsearch使用介绍(二)
一.前言 写博客,更要努力写博客! 二.Mapping介绍 Mapping类似于数据库中的表结构的定义:这里我们试想一下表结构定义需要那些: 1.字段和字段类型,在Elasticsearch中 ...
- Web后台快速开发框架
Web后台快速开发框架 Coldairarrow 目录 目录 第1章 目录 1 第2章 简介 3 第3章 基础准备 4 3.1 开发环境要求 4 3.2 ...
- 多线程手写Future模式
future模式 在进行耗时操作的时候,线程直接阻塞,我们需要优化这样的代码,让他再启动一个线程,不阻塞.可以执行下面的代码. 这个时候我们就用到了未来者模式 future设计类 只有一个方法 pub ...
- clipboardjs复制到粘贴板
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat=&qu ...
- Python开发【第十六篇】:AJAX全套(转)
作者:武沛齐 出处:http://www.cnblogs.com/wupeiqi/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接. 概述 对于 ...
- Scrapy:配置日志
Scrapy logger 在每个spider实例中提供了一个可以访问和使用的实例,方法如下: import scrapy class MySpider(scrapy.Spider): name = ...