1. DevExpress.XtraTreeList控件
        将其简称为tree,tree其实就是一个树表控件,他像树一样包含具有父子关系的若干节点,同时每个节点又是一个带有多个字段的记录。其用法非常简单方便,只需要为其配置带有父子关系的数据源,其就可以按照树的形式进行显示。
1.1 DevExpress.XtraTreeList配置数据源
   数据源一般是一个二维表,可以是数据库中的表,该表中要包含表示父子关系的两个字段,即主键和父亲的主键。下面的代码是手动创建的数据源DataTable。

C# code?
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。上码,上
图,如下:

C# code?
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的更多相关文章

  1. 关于 DevExpress.XtraTreeList.TreeList 树形控件 的操作

    作为一个C#程序员,在写程序时一直以来都使用的微软那一套控件,用起来特别爽,可是最近公司的一个项目用到了DevExpress框架,不用不知道,一用吓一跳,不得不承认这个框架确实很强大,效果也很炫,但是 ...

  2. DevExpress XtraTreeList的复选框 禁用

    树的2个事件代码如下,通过节点的tag判断是否禁用节点前的复选框.树的节点加载时设置要禁用的节点tag为-1,不禁用的则设为相关的值 private void treeListPer_CustomDr ...

  3. DevExpress XtraTreeList TreeList复选框选择

    权限管理涉及复选框多勾选. 1.控件属性设置 TreeList.OperationView.ShowCheckBoxes=true;用于显示CheckBox: TreeList.OperationBe ...

  4. DevExpress.XtraTreeList 小结

    搞了半天才绑定好,没有弄清楚父子之间的关系 <dx:ASPxTreeList ID="ASPxTreeList1" runat="server" Auto ...

  5. 在DevExpress程序中使用TeeList控件以及节点查询的处理

    在很多情况下,我们需要通过树列表进行数据的展示,如一些有层次关系的数据,通过有层级的展示,能够使用户更加直观查看和管理相关的数据.在一般Winform开发的情况下,可以使用微软的TreeView控件, ...

  6. Devexpress treeList

    1.数据绑定最基本的两个属性:KeyFieldName和ParentFieldName. SELECT OfficeID,OfficeName,ParentOfficeID FROM tOffice ...

  7. DevExpress控件安装、汉化使用教程

    前言 DevExpress是一个庞大的控件库,也很是好用(没用过,听说),但是要收费. 网上关于DevExpress的教程满天飞,我找了一下午也没找到正确的安装.简单实用教程,还是自己摸索吧. 自己动 ...

  8. DevExpress TreeList使用心得

    来自:http://www.cnblogs.com/sndnnlfhvk/archive/2011/05/15/2046920.html 最近做项目新增光纤线路清查功能模块,思路和算法已经想好了,些代 ...

  9. DevExpress TreeList 全选和反选 z

    /// <summary> /// 全选树 /// </summary> /// <param name="tree">树控件</para ...

随机推荐

  1. 有向图强连通分量Tarjan算法

    在https://www.byvoid.com/zhs/blog/scc-tarjan中关于Tarjan算法的描述非常好,转述如下: 首先解释几个概念: 有向图强连通分量:在有向图G中,如果两个顶点间 ...

  2. 移动平台自动化测试:appium(二)

    环境搭建.本环境基于win7_x64搭建 安装环境需要用到的工具清单: android sdk:https://developer.android.com/studio/index.html Appi ...

  3. mysql备份策略

    1.备份的种类 完全备份,就是备份整个数据库对象 事务日志备份, 备份事务日志记录上一次的数据库改变 增量备份,也叫差异备份 文件备份 2.备份方式 逻辑备份, 既备份sql语句,使用mysql自带的 ...

  4. iOS runLoop 理解

    目录 概述 run loop modes 一.概述 run loop叫事件处理循环,就是循环地接受各种各样的事件.run loop是oc用来管理线程里异步事件的工具.一个线程通过run loop可以监 ...

  5. [THUWC2017][bzoj5020] 在美妙的数学王国中畅游 [LCT+泰勒展开]

    题面 LOJ传送门 思路 这里很重要 它提示我们,把给定的三个函数泰勒展开,并用LCT维护每一项泰勒展开式的值,维护十几项就满足了题目的精度要求 我们考虑一个函数在0位置的泰勒展开 $f(x)=\su ...

  6. Iterator pattern 及其在java API中的运用

    1.问题: 当我们看到java中的Collection,List,Set,Map等集合类时都可以用Iterator进行遍历元素时,我们是否感到很神奇.我们不禁要问java是如何实现这一目标的.这就是我 ...

  7. 自定义View Layout过程 (3)

    目录 目录 1. 知识基础 具体请看我写的另外一篇文章:(1)自定义View基础 - 最易懂的自定义View原理系列 2. 作用 计算View视图的位置. 即计算View的四个顶点位置:Left.To ...

  8. 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 ...

  9. 11.OpenStack 安装监控和业务流程服务

    安装业务流程模块 安装和配置业务流程 创建数据库 mysql -uroot -ptoyo123 CREATE DATABASE heat; GRANT ALL PRIVILEGES ON heat.* ...

  10. FileInputStream读取文件&FileOutputStream写入文件

    概念摘自:http://jingyan.baidu.com/article/5552ef473ab5f2518ffbc98e.html Java的流式输入输出建立在4个抽象类的基础上:InputStr ...