DevExpress.XtraTreeList
1. DevExpress.XtraTreeList控件
将其简称为tree,tree其实就是一个树表控件,他像树一样包含具有父子关系的若干节点,同时每个节点又是一个带有多个字段的记录。其用法非常简单方便,只需要为其配置带有父子关系的数据源,其就可以按照树的形式进行显示。
1.1 DevExpress.XtraTreeList配置数据源
数据源一般是一个二维表,可以是数据库中的表,该表中要包含表示父子关系的两个字段,即主键和父亲的主键。下面的代码是手动创建的数据源DataTable。
|
1
2
3
4
5
6
7
8
9
10
11
|
DataTable dtAllPath = new DataTable("dtAllPath"); dtAllPath.Columns.Add("nodeID", typeof(int)); dtAllPath.Columns.Add("parNodeID", typeof(int)); dtAllPath.Columns.Add("stateName", typeof(string)); dtAllPath.Columns.Add("stateCode", typeof(string)); dtAllPath.Columns.Add("condition", typeof(string)); dtAllPath.Rows.Add(new object[] { 1, 0, "1", "1", "" });dtAllPath.Rows.Add(new object[] { 2, 0, "2", "2", "" });dtAllPath.Rows.Add(new object[] { 3, 1, "1.1", "1.1", "" });dtAllPath.Rows.Add(new object[] { 4, 2, "2.1", "2.1", "" });treeList1.DataSource = dtAllPath; |
上面的代码中,nodeID是每行记录的主键,parNodeID是每行记录的父亲记录的主键,0表示树的根结点。最后一行代码是将生成的数据源交给
tree显示。当然为了完成树的显示工作,还需要配置tree的KeyFieldName属性为nodeID,ParentFieldName属性为
parNodeID(选中tree,在vs的属性窗口设置),还需要为tree添加列并配置该列与数据源中的字段对应关系,右键tree控件选择
run designer弹出下图,FieldName用来配置对应关系,tree中添加了两列,第一列和stateCode对应,designer可以
配置tree的各种属性,列标题,cell中的字体颜色等等,不再一一赘述。

1.2 DevExpress.XtraTreeList添加checkbox
在tree的结点中添加checkbox是一项非常实用常见的功能,设置起来非常简单,选中tree,在VS的属性窗口中,找到OptionsView\ShowCheckBoxes,将其设置为true,即可。
1.3 DevExpress.XtraTreeList列表中添加ComboBox
在tree控件中直接对信息进行编辑,有时可能需要用到ComboBox控件,具体添加方法,右键/run designer/选择列
/ColumnEdit/New,为该列创建一个内嵌的ComboBox控件,即repositoryItemComboBox,具体如下图所示。

1.4 repositoryItemComboBox下拉表不能显示
通过repositoryItemComboBox的click事件,向其动态add下拉列表中的items后,点击
repositoryItemComboBox的下拉按钮,下拉列表闪一下就消失了(不是在click事件中添加items的情况,不会出现此问题)。解
决方案,在repositoryItemComboBox的ButtonClick事件中,将事件源sender转换为ComboBoxEdit,再利用
add函数添加item,最后手动显示下拉列表,代码如下:
ComboBoxEdit combo = sender as ComboBoxEdit; combo.Properties.Items.Add(…);
combo.ShowPopup();
1.5 DevExpress.XtraTreeList设置焦点函数setFocusedNode()无效
当使用TreeListNode addedNode = treeList1.AppendNode(参数略),向tree中添加一个节点后,一
般想立刻使这个新添加的节点获得焦点,但此时如果直接使用treeList1.SetFocusedNode(addedNode)则无效,可能是因为
addedNode中不包含tree为其分配的nodeID(猜测),解决方案是
treeList1.SetFocusedNode(treeList1.FindNodeByKeyID(stateID));即利用findnode
之类的函数去查询tree,找到新添加的结点,在将该节点作为SetFocusedNode的参数,则可以完成焦点的设置。
1.6 DevExpress.XtraTreeList查找结点函数FindNodeByKeyID()无效
tree的find这类函数,在进行查找时,需要注意参数的类型,例如,这个函数FindNodeByKeyID()是根据数据源里的主键进行结点查
找,即你需要给定tree对应数据源中的记录的key,如果数据源中的key是整型,而我们利用一个字符串类型作为参数的
话, FindNodeByKeyID(”100”)将不能找到节点,正确的写法应该是FindNodeByKeyID(100)。
1.7 DevExpress.XtraTreeList部分结点添加checkbox或者图片
有些时候,不想在所有节点前都添加checkbox或者想在结点前添加图片,此时需要手动添加事件CustomDrawNodeCheckBox的
处理函数,在函数中为某些结点定制checkbox,或者图片,本处只着重说明定制checkbox,关于结点图片的代码可以参考网址
https://www.devexpress.com/Support/Center/Question/Details/Q142494。上码,上
图,如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
private void treeList2_CustomDrawNodeCheckBox(object sender, DevExpress.XtraTreeList.CustomDrawNodeCheckBoxEventArgs e) { String variID = e.Node.GetValue("variID").ToString();//e.Node为tree的结点 //满足该条件的结点,为其设置checkbox,其他结点没有checkbox if (variID == "") { DevExpress.XtraTreeList.ViewInfo.IndentInfo ii = treeList2.ViewInfo.RowsInfo[e.Node].IndentInfo; int x2 = e.Bounds.Left + ii.LevelWidth / 2; int y2 = e.Bounds.Top + e.Bounds.Height / 2; int h2 = e.Bounds.Height / 2 + 1; Rectangle r1 = new Rectangle(e.Bounds.Left, y2, e.Bounds.Width, 1); Rectangle r2 = new Rectangle(x2, y2, 1, h2); e.Graphics.FillRectangle(treeList2.ViewInfo.RC.TreeLineBrush, r1); if (e.Node.Expanded) { e.Graphics.FillRectangle(treeList2.ViewInfo.RC.TreeLineBrush, r2); } e.Handled = true; } } |

在最近的工作中,使用到了DevExpress中的XtraTreeList用法,正好借此机会研究一下此控件的应用,现将其应用技巧与大家分享一下。
1、使用XtraTreeList绑定数据(数据格式可以为ArrayList形式)
我们实例说明要实现下面样式的窗体:

首先,在Run Designer里面添加两个列(columns),设置两列的属性,其中第一列“名称”为string格式,FieldName为Name;第二列“选 择”将ColumnEdit属性设置为CheckEdit1,FieldName为IsChecked,设置完毕。
其次可以编写一个类,用来绑定TreeList,针对此TreeList窗体,其类代码设置如下:
public class TestTreeList
{
public TestTreeList()
{
}
//名称字段变量
private string m_sName = string.Empty;
//选择字段变量
private bool m_bIsChecked = false;
//子Node节点ID变量
private int m_iID = -1;
//父Node节点ID变量
private int m_iParentID = -1;
public int ID
{
get
{
return m_iID;
}
set
{
m_iID = value;
}
}
public int ParentID
{
get
{
return m_iParentID;
}
set
{
m_iParentID = value;
}
}
public string Name
{
get
{
return m_sName;
}
set
{
m_sName = value;
}
}
public bool IsChecked
{
get
{
return m_bIsChecked;
}
set
{
m_bIsChecked = value;
}
}
}
类构造完成,在FormLoad里面借助此类对TreeList进行绑定:
private void Form1_Load(object sender, EventArgs e)
{
ArrayList pList = new ArrayList();
TestTreeList p = new TestTreeList();
p.Name = "测试1";
p.IsChecked = true;
p.ID = 1;
pList.Add(p);
TestTreeList q = new TestTreeList();
q.Name = "测试2";
q.IsChecked = false;
q.ParentID = 1;
q.ID = 2;
pList.Add(q);
this.treeList1.DataSource = pList;
this.treeList1.RefreshDataSource();
}
这样就可以构造出一个简单的TreeList应用方法,程序运行结果可得第一幅图所示。
2、DevTreeList改变样式:
如果将TreeList控件改变成如下样式(同第一幅图不一样,将Check控件显示在节点最前面)。

可以直接修改其控件的ShowCheckBoxes属性即可(其它样式类似如下)。

3、DevTreeList非绑定形式实现:动态加载,构建:
运行样式如下:

实现动态加载的几个函数实现如下:
/// <summary>
/// 动态创建TreeList的Column,一列为图层名,一列为是否统计列Check控件
/// </summary>
private void creatTreeListControl()
{
DevExpress.XtraTreeList.Columns.TreeListColumn treeListColumnLayerName= new DevExpress.XtraTreeList.Columns.TreeListColumn();
treeListColumnLayerName.Caption = "名称";
treeListColumnLayerName.FieldName = "LayerName";
treeListColumnLayerName.MinWidth = 38;
treeListColumnLayerName.Name = "treeListColumnLayerName";
treeListColumnLayerName.Visible = true;
treeListColumnLayerName.VisibleIndex = 0;
treeListColumnLayerName.Width = 111;
DevExpress.XtraTreeList.Columns.TreeListColumn treeListColumnStatisticValue=new DevExpress.XtraTreeList.Columns.TreeListColumn();
treeListColumnStatisticValue.Caption = "统计值";
treeListColumnStatisticValue.ColumnEdit = this.repositoryItemCheckEdit1;
treeListColumnStatisticValue.FieldName = "StatisticValue";
treeListColumnStatisticValue.Name = "treeListColumnStatisticValue";
treeListColumnStatisticValue.Visible = true;
treeListColumnStatisticValue.VisibleIndex = 1;
this.treeListLayerControl.Columns.AddRange(new DevExpress.XtraTreeList.Columns.TreeListColumn[] {
treeListColumnLayerName,
treeListColumnStatisticValue});
this.treeListLayerControl.Nodes.Clear();
this.treeListLayerControl.Refresh();
}
/// <summary>
/// 动态创建TreeList Layer Node节点
/// </summary>
/// <param name="layerName"></param>
/// <param name="check"></param>
private void creatMainLayerNode(string layerName,bool check)
{
this.treeListLayerControl.BeginUnboundLoad();
this.treeListLayerControl.AppendNode(new object[] { layerName,check}, -1);
this.treeListLayerControl.EndUnboundLoad();
}
/// <summary>
/// 动态创建TreeList 字段属性值 Node节点
/// </summary>
/// <param name="ValueName"></param>
/// <param name="check"></param>
/// <param name="ID"></param>
private void CreatChildNode(string ValueName, bool check,int ID)
{
this.treeListLayerControl.BeginUnboundLoad();
this.treeListLayerControl.AppendNode(new object[] { ValueName, check }, ID);
this.treeListLayerControl.EndUnboundLoad();
}
/// <summary>
/// 获得图层名节点的Index值
/// </summary>
/// <param name="ParentNodeName"></param>
/// <returns></returns>
private int getParentID(string ParentNodeName)
{
int i = -1;
for (i = 0; i < this.treeListLayerControl.Nodes.Count;i++ )
{
if (this.treeListLayerControl.Nodes[i][0].ToString() == ParentNodeName)
{
break;
}
}
return i;
}
/// <summary>
/// 当点击Node事件发生改变(点击主节点时,其子节点跟着主节点变化)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void treeListLayerControl_CellValueChanging(object sender, DevExpress.XtraTreeList.CellValueChangedEventArgs e)
{
if (e.Column.Name.Equals("treeListColumnStatisticValue") && e.Node.HasChildren)
{
object objCol = this.treeListLayerControl.Columns[1];
for (int i = 0; i < e.Node.Nodes.Count; i++)
{
e.Node.Nodes[i].SetValue(objCol, e.Value);
}
e.Node.SetValue(objCol, e.Value);
}
}
创建子节点方法:
int indexLayerTree = this.getParentID(playerInfo.LayerName);
if (indexLayerTree == -1)
return;
CreatChildNode(sValue, false, this.treeListLayerControl.Nodes[indexLayerTree].Id);
其创建主节点和创建子节点方法类似,比创建子节点简单的多。
4、总结
以上为个人研究DevExpress TreeList使用的大致方法,尽管文笔简单潦草,但是针对TreeList的基本使用足矣。
另外,DevExpress控件可以使系统界面做的十分漂亮,我的截图界面显得丑陋,只因为是实验程序,并不是真正应用,还请大家不要误解。
DevExpress.XtraTreeList的更多相关文章
- 关于 DevExpress.XtraTreeList.TreeList 树形控件 的操作
作为一个C#程序员,在写程序时一直以来都使用的微软那一套控件,用起来特别爽,可是最近公司的一个项目用到了DevExpress框架,不用不知道,一用吓一跳,不得不承认这个框架确实很强大,效果也很炫,但是 ...
- DevExpress XtraTreeList的复选框 禁用
树的2个事件代码如下,通过节点的tag判断是否禁用节点前的复选框.树的节点加载时设置要禁用的节点tag为-1,不禁用的则设为相关的值 private void treeListPer_CustomDr ...
- DevExpress XtraTreeList TreeList复选框选择
权限管理涉及复选框多勾选. 1.控件属性设置 TreeList.OperationView.ShowCheckBoxes=true;用于显示CheckBox: TreeList.OperationBe ...
- DevExpress.XtraTreeList 小结
搞了半天才绑定好,没有弄清楚父子之间的关系 <dx:ASPxTreeList ID="ASPxTreeList1" runat="server" Auto ...
- 在DevExpress程序中使用TeeList控件以及节点查询的处理
在很多情况下,我们需要通过树列表进行数据的展示,如一些有层次关系的数据,通过有层级的展示,能够使用户更加直观查看和管理相关的数据.在一般Winform开发的情况下,可以使用微软的TreeView控件, ...
- Devexpress treeList
1.数据绑定最基本的两个属性:KeyFieldName和ParentFieldName. SELECT OfficeID,OfficeName,ParentOfficeID FROM tOffice ...
- DevExpress控件安装、汉化使用教程
前言 DevExpress是一个庞大的控件库,也很是好用(没用过,听说),但是要收费. 网上关于DevExpress的教程满天飞,我找了一下午也没找到正确的安装.简单实用教程,还是自己摸索吧. 自己动 ...
- DevExpress TreeList使用心得
来自:http://www.cnblogs.com/sndnnlfhvk/archive/2011/05/15/2046920.html 最近做项目新增光纤线路清查功能模块,思路和算法已经想好了,些代 ...
- DevExpress TreeList 全选和反选 z
/// <summary> /// 全选树 /// </summary> /// <param name="tree">树控件</para ...
随机推荐
- 有向图强连通分量Tarjan算法
在https://www.byvoid.com/zhs/blog/scc-tarjan中关于Tarjan算法的描述非常好,转述如下: 首先解释几个概念: 有向图强连通分量:在有向图G中,如果两个顶点间 ...
- 移动平台自动化测试:appium(二)
环境搭建.本环境基于win7_x64搭建 安装环境需要用到的工具清单: android sdk:https://developer.android.com/studio/index.html Appi ...
- mysql备份策略
1.备份的种类 完全备份,就是备份整个数据库对象 事务日志备份, 备份事务日志记录上一次的数据库改变 增量备份,也叫差异备份 文件备份 2.备份方式 逻辑备份, 既备份sql语句,使用mysql自带的 ...
- iOS runLoop 理解
目录 概述 run loop modes 一.概述 run loop叫事件处理循环,就是循环地接受各种各样的事件.run loop是oc用来管理线程里异步事件的工具.一个线程通过run loop可以监 ...
- [THUWC2017][bzoj5020] 在美妙的数学王国中畅游 [LCT+泰勒展开]
题面 LOJ传送门 思路 这里很重要 它提示我们,把给定的三个函数泰勒展开,并用LCT维护每一项泰勒展开式的值,维护十几项就满足了题目的精度要求 我们考虑一个函数在0位置的泰勒展开 $f(x)=\su ...
- Iterator pattern 及其在java API中的运用
1.问题: 当我们看到java中的Collection,List,Set,Map等集合类时都可以用Iterator进行遍历元素时,我们是否感到很神奇.我们不禁要问java是如何实现这一目标的.这就是我 ...
- 自定义View Layout过程 (3)
目录 目录 1. 知识基础 具体请看我写的另外一篇文章:(1)自定义View基础 - 最易懂的自定义View原理系列 2. 作用 计算View视图的位置. 即计算View的四个顶点位置:Left.To ...
- python 错误 error: invalid command 'egg_info'
Processing /bs4-0.0.1/setuptools-38.4.0/numpy-1.14.0 Complete output from command python setup.py ...
- 11.OpenStack 安装监控和业务流程服务
安装业务流程模块 安装和配置业务流程 创建数据库 mysql -uroot -ptoyo123 CREATE DATABASE heat; GRANT ALL PRIVILEGES ON heat.* ...
- FileInputStream读取文件&FileOutputStream写入文件
概念摘自:http://jingyan.baidu.com/article/5552ef473ab5f2518ffbc98e.html Java的流式输入输出建立在4个抽象类的基础上:InputStr ...