第一种:DataSource绑定,这种绑定方式需要设置TreeList的ParentFieldName和KeyFieldName两个属性,这里需要注意的是KeyFieldName的值必须是唯一的。

代码如下:

 private void Form1_Load(object sender, EventArgs e)
{
try
{
//构建一个DataTable数据源
DataTable table = new DataTable();
table.Columns.Add("parentId");
table.Columns.Add("Id");
table.Columns.Add("parentName");
table.Columns.Add("Name");
DataRow row = table.NewRow();
row["parentId"] = "";
row["Id"] = "*";
row["Name"] = "所有颜色";
table.Rows.Add(row);
row = table.NewRow();
row["parentId"] = "*";
row["Id"] = "";
row["Name"] = "红色";
table.Rows.Add(row);
row = table.NewRow();
row["parentId"] = "*";
row["Id"] = "";
row["Name"] = "黄色";
table.Rows.Add(row);
row = table.NewRow();
row["parentId"] = "*";
row["Id"] = "";
row["Name"] = "绿色";
table.Rows.Add(row);
row = table.NewRow();
row["parentId"] = "";
row["Id"] = "";
row["Name"] = "粉红色";
table.Rows.Add(row);
row = table.NewRow();
row["parentId"] = "";
row["Id"] = "";
row["Name"] = "鹅黄色";
table.Rows.Add(row);
treeList1.ParentFieldName = "parentId";
treeList1.KeyFieldName = "Id";
treeList1.DataSource = table;
treeList1.ExpandAll();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
} private void treeList1_BeforeCheckNode(object sender, DevExpress.XtraTreeList.CheckNodeEventArgs e)
{
e.State = (e.PrevState == CheckState.Checked ? CheckState.Unchecked : CheckState.Checked);
} private void treeList1_AfterCheckNode(object sender, DevExpress.XtraTreeList.NodeEventArgs e)
{
try
{
SetCheckedChildNodes(e.Node, e.Node.CheckState);
SetCheckedParentNodes(e.Node, e.Node.CheckState);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
} /// <summary>
/// 设置子节点的状态
/// </summary>
/// <param name="node"></param>
/// <param name="check"></param>
private void SetCheckedChildNodes(TreeListNode node, CheckState check)
{
for (int i = ; i < node.Nodes.Count; i++)
{
node.Nodes[i].CheckState = check;
SetCheckedChildNodes(node.Nodes[i], check);
}
} /// <summary>
/// 设置父节点的状态
/// </summary>
/// <param name="node"></param>
/// <param name="check"></param>
private void SetCheckedParentNodes(TreeListNode node, CheckState check)
{
if (node.ParentNode != null)
{
bool b = false;
CheckState state;
for (int i = ; i < node.ParentNode.Nodes.Count; i++)
{
state = (CheckState)node.ParentNode.Nodes[i].CheckState;
if (!check.Equals(state))
{
b = !b;
break;
}
}
node.ParentNode.CheckState = b ? CheckState.Checked : check;
SetCheckedParentNodes(node.ParentNode, check);
}
}

运行效果图:

第二种:AppendNode添加节点

代码如下:

        private void LoadTree()
{
//清空节点
treeList1.BeginUnboundLoad();
treeList1.ClearNodes();
arrayList = new List<TreeListNode>();
//绑定部位树树的第一层
TreeListNode Node = treeList1.Nodes.Add(new object[] { "所有颜色", "*"});
Node.Tag = "*";
arrayList.Add(Node);
//绑定第二层
DataSet ds = SqlHelper.Query(@"select ctc.colorId as ParentNodeID,ctc.childcolorId as NodeID, cc.names as NodeName
from C_colorTocolor ctc(nolock)
inner join C_color cc(nolock) on ctc.childcolorId=cc.id");
if (ds != null && ds.Tables.Count > 0)
{
table = ds.Tables[0];
DataRow[] rows = table.Select("ParentNodeID='*'");
foreach (DataRow row in rows)
{
TreeListNode tn = treeList1.AppendNode(new object[] { row["NodeName"].ToString(), row["NodeID"].ToString() }, Node.Id);
tn.Tag = row["NodeID"].ToString();
arrayList.Add(tn);
BindNode(row["NodeID"].ToString(), tn);
}
}
treeList1.EndUnboundLoad();
treeList1.ExpandAll();
} private void BindNode(string nodeId, TreeListNode tn)
{
DataRow[] rows = table.Select("ParentNodeID='" + nodeId + "'");
foreach (DataRow row in rows)
{
TreeListNode tns = treeList1.AppendNode(new object[] { row["NodeName"].ToString(), row["NodeID"].ToString()}, tn.Id);
tns.Tag = row["NodeID"].ToString();
arrayList.Add(tns);
BindNode(row["NodeID"].ToString(), tns);
}
} private void Form2_Load(object sender, EventArgs e)
{
//绑定树
LoadTree();
}

运行效果图:

第三种:VirtualTreeGetChildNodes虚拟树加载。这种模式主要用于数据量过多,打开界面比较慢的情况。

private void Form3_Load(object sender, EventArgs e)
{
//初始化树
InitData();
} bool isload = false;
void InitData()
{
isload = false;
treeList1.ClearNodes();
treeList1.DataSource = new object();
} private void treeList1_VirtualTreeGetChildNodes(object sender, DevExpress.XtraTreeList.VirtualTreeGetChildNodesInfo e)
{
Cursor current = Cursor.Current;
Cursor.Current = Cursors.WaitCursor;
if (!isload)
{
List<O_node> roots = new List<O_node> { new O_node() { id= "*", names= "所有颜色",parentid="" } };
e.Children = roots;
isload = true;
}
else
{
try
{
O_node on = e.Node as O_node;
if(on!=null)
{
string sql = string.Format(@"select ctc.colorId as parentid,ctc.childcolorId as id, cc.names as names
from C_colorTocolor ctc(nolock)
inner join C_color cc(nolock) on ctc.childcolorId = cc.id
where ctc.colorId = '{0}'", on.id);
DataSet ds = SqlHelper.Query(sql);
if (ds != null && ds.Tables.Count > 0)
{
List<O_node> lst = (List<O_node>)DataTableToList<O_node>(ds.Tables[0]);
e.Children = lst;
}
else
{
e.Children = new object[] { };
}
}
else
{
e.Children = new object[] { };
}
}
catch
{
e.Children = new object[] { };
}
}
Cursor.Current = current;
} private void treeList1_VirtualTreeGetCellValue(object sender, DevExpress.XtraTreeList.VirtualTreeGetCellValueInfo e)
{
string name = string.Empty;
if (e.Node is O_node)
{
name = (e.Node as O_node).names;
}
if (e.Column == treeListColumn1) e.CellData = name;
} public static IList<T> DataTableToList<T>(DataTable table)
where T : class
{
if (!IsHaveRows(table))
return new List<T>();
IList<T> list = new List<T>();
T model = default(T);
foreach (DataRow dr in table.Rows)
{
model = Activator.CreateInstance<T>();
foreach (DataColumn dc in dr.Table.Columns)
{
object drValue = dr[dc.ColumnName];
PropertyInfo pi = model.GetType().GetProperty(dc.ColumnName);
if (pi != null && pi.CanWrite && (drValue != null && !Convert.IsDBNull(drValue)))
{
pi.SetValue(model, drValue, null);
}
}
list.Add(model);
}
return list;
} /// <summary>
/// 检查DataTable 是否有数据行
/// </summary>
/// <param name="dt">DataTable</param>
/// <returns></returns>
public static bool IsHaveRows(DataTable dt)
{
if (dt != null && dt.Rows.Count > 0)
{
return true;
}
else
{
return false;
}
}
} #region 节点
public class O_node
{
public string id { get; set; }
public string names { get; set; }
public string parentid { get; set; }
}
#endregion

运行效果图:

完整示例代码:https://download.csdn.net/download/u012026245/11986777

csdn现在资源积分上传时都是固定积分为5分了,如果需要完整代码的可以去下载一下。

Devexpress WinForm TreeList的三种数据绑定方式(DataSource绑定、AppendNode添加节点、VirtualTreeGetChildNodes(虚拟树加载模式))的更多相关文章

  1. ListView 的三种数据绑定方式

    ListView 的三种数据绑定方式   1.最原始的绑定方式: public ObservableCollection<object> ObservableObj; public Mai ...

  2. C#Xml的三种创建方式(或者是两种?)和增删改查

    一.Xml的创建方式 Xmlwriter(流式读取,Stream) 写过了:https://www.cnblogs.com/dengzhekaihua/p/15438493.html 这种方法虽然快, ...

  3. C# 三种打印方式含代码

    一:C#代码直接打印pdf文件(打印质保书pdf文件) 引用: 代码注释很详细了. private void btn_pdf_Click(object sender, RoutedEventArgs ...

  4. 【转】vue.js三种安装方式

    Vue.js(读音 /vjuː/, 类似于 view)是一个构建数据驱动的 web 界面的渐进式框架.Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件.它不仅易于上手 ...

  5. vue.js三种安装方式

    Vue.js(读音 /vjuː/, 类似于 view)是一个构建数据驱动的 web 界面的渐进式框架.Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件.它不仅易于上手 ...

  6. 通过三个DEMO学会SignalR的三种实现方式

    一.理解SignalR ASP .NET SignalR 是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信(即:客户端(Web页面)和服务器端可以互相实时的通知消息 ...

  7. Hive metastore三种配置方式

    http://blog.csdn.net/reesun/article/details/8556078 Hive的meta数据支持以下三种存储方式,其中两种属于本地存储,一种为远端存储.远端存储比较适 ...

  8. django 模板语法和三种返回方式

    模板 for循环 {% for athlete in athlete_list %} <li>{{ athlete.name }}</li> {% endfor %} if语句 ...

  9. js的三种继承方式及其优缺点

    [转] 第一种,prototype的方式: //父类 function person(){ this.hair = 'black'; this.eye = 'black'; this.skin = ' ...

随机推荐

  1. Codeforces 812E Sagheer and Apple Tree ——(阶梯博弈)

    之前在bc上做过一道类似的阶梯博弈的题目,那题是移动到根,这题是移动到叶子.换汤不换药,只要和终态不同奇偶的那些位置做nim即可.因此这题给出了一个条件:所有叶子深度的奇偶性相同.同时需要注意的是,上 ...

  2. form表单无刷新提交

    Ajax最大的特点就是可以不刷新页面而实现数据的通信及更改页面信息.那么用AJAX进行后台通信传递字符串还是可以的,遇到上传文件该怎么办呢?基于安全考虑,JS是不能直接进行文件操作的,只好用原始的fr ...

  3. 20182332 实验四《Java Socket编程 》实验报告

    20182332 实验肆<数据结构与面向对象程序设计>实验报告 课程:<程序设计与数据结构> 班级: 1823 姓名: 盛国榕 学号:20182332 实验教师:王志强 实验日 ...

  4. SCRIPT438: 对象不支持“trim”属性或方法

    关于ie9以下不支持trim()方法 可以在自己封装的框架中加入如下.或直接调用也行. if(!String.prototype.trim) { String.prototype.trim = fun ...

  5. 性能分析 | Java服务器内存过高&CPU过高问题排查

    一.内存过高 1.内存过高一般有两种情况:内存溢出和内存泄漏 (1)内存溢出:程序分配的内存超出物理机的内存大小,导致无法继续分配内存,出现OOM报错 (2)内存泄漏:不再使用的对象一直占据着内存不释 ...

  6. LC 983. Minimum Cost For Tickets

    In a country popular for train travel, you have planned some train travelling one year in advance.  ...

  7. Http的请求协议请求行介绍

    请求协议包含的内容 请求行 GET /day04-tomcat/index.jsp HTTP/1.1 HTTP/1.1: 表示的是我们使用的是http协议的1.1版本 请求头 请求空行 请求体: 存储 ...

  8. Windows 10 搭建Python3 安装使用 protobuf

    Protobuf对比XML.Json等其他序列化的优势 protobuf 不管是处理时间上,还是空间占用上都优于现有的其他序列化方式.内存暂用是java 序列化的1/9,时间也是差了一个数量级,一次操 ...

  9. ElasticSearch——分页查询

    前言 ElasticSearch实现分页查询,有3种方式,他们在数据查询中各自占据着不同的优势,因此在搜索引擎的数据分页过程中,如何更好地利用各自的优势来进行数据查询是一个非常重要的过程. 传统分页( ...

  10. mud那些坑 find_object问题

    find_object  find_object 没有找到对象时  实际上会load_obejct 一次,需要设定一个标记表示 find_obejct 找出来的 对象和需要对比的对象有什么不同 只要n ...