C#开发WinForm之DevExpress框架里TreeList使用

更新时间:2023-06-17 20:52:49 阅读: 评论:0

C#开发WinForm之DevExpress框架⾥TreeList使⽤
C#开发WinForm之DevExpress框架⾥TreeList使⽤
⽂章⽬录
乐字拼音
前⾔
winForm⾥树型结构是⽐较常见的,不论何种前端开发,树型都需要学会怎么⽤。
⽽DexExpress⾥的TreeList是⽐较特殊的使⽤⽅式 ,因为它的数据结构是“平级”的,从结构上讲,数据没有上下级关系。都放在DataRowCollection这个Map集合⾥,它通过指定KeyFieldName和ParentFieldName来标明上⾯级关系。换句话说,数据是平等的,关键在逻辑上来处理⽗⼦关系。
新建⼀下windows 窗体,拖拽⼀下DevExpress.XtraTreeList.TreeList到窗体上,命名为workSpaceTree。
如下图⽅式打开列的设计⾯板
在这⾥可以指定展⽰的列,每⼀个属性都必需指定列,但我们可以设置列是否显⽰,所以我们同样可以控制列的展⽰。
以后台返回的如下json格式数据为例
{
"uid": "480304801154859009",
"objectName": "⿁六村族谱",
"children": [
{
"uid": "515117932112510976",
"objectName": "张三",
"releaStatus": "Working",
"children": [
{
"uid": "518088753315577856",
"objectName": "张三⼤⼉⼦",
"children": []
},
{
"uid": "504962126524186624",
"objectName": "张三⼆⼉⼦",
"children": [
{
"uid": "504962126557741056",
"objectName": "张三⼤孙⼦",
"children": []
}
]
}
]
},
{
"uid": "518079417910558720",
"objectName": "张四",
"children": []
鱼翅汤的做法}
}
简单的数据结构,有⽗⼦关系。
初始化树结构
/// <summary>
/// 初始化树信息
/// </summary>
private void LoadData(WorkspaceRootVo workspaceRootVo)
撩妹技能
{
this.workSpaceTree.Nodes.Clear();
this.workSpaceTree.BeginUpdate();
DataTable dt = new DataTable();
dt.Columns.Add("uid");
dt.Columns.Add("index");
dt.Columns.Add("parentUid");
dt.Columns.Add("parentIndex");
dt.Columns.Add("objectName");
int index = 0;
ParDataTable(dt, workspaceRootVo.data, null, ref index, 0);
//TreeList绑定数据
this.workSpaceTree.DataSource = dt;
this.workSpaceTree.KeyFieldName = "index";
this.workSpaceTree.ParentFieldName = "parentIndex";
this.workSpaceTree.EndUpdate();
this.workSpaceTree.ExpandAll();
}
LoadData⽅法的参数WorkspaceRootVo 是上⾯json数据对象,如果不懂怎么解析,可百度Newtonsoft.Json,DataTable是树的数据源,指定给this.workSpaceTree.DataSource即可。 this.workSpaceTree.KeyFieldName和this.workSpaceTree.ParentFieldName指定⽗⼦关系。
ParDataTable⽅法如下:
private void ParDataTable(DataTable dt, WorkspaceVo childVo, WorkspaceVo parentVo, ref int childIndex, int parentIndex)
{
DataRow dataRow = dt.NewRow();
dataRow["uid"] = childVo.uid;
哄女朋友故事int index = ++childIndex;
dataRow["index"] = index;
dataRow["objectName"] = childVo.objectName;
if (null != parentVo)
{
dataRow["parentUid"] = parentVo.uid;
5xxx
dataRow["parentIndex"] = parentIndex;
}
el
{
dataRow["parentUid"] = null;
dataRow["parentIndex"] = null;
}
做贺卡dt.Rows.Add(dataRow);
if (null != childVo.children && childVo.children.Count > 0)
{
foreach (WorkspaceVo itemVo in childVo.children)
{
ParDataTable(dt, itemVo, childVo, ref childIndex, index);
}
}
}
通过递归调⽤,构建数据,每⼀个DataRow都通过dt.Rows.Add(dataRow);添加到Map集合⾥,本⾝没有⽗⼦关系,通过
index和parentIndex,在逻辑上处理成⽗⼦关系。
按如上⽅式即可渲染出⼀个树。
TreeList选中事件
给TreeList增加FocudNodeChanged获得焦点事件。增加的⽅法如下
this.workSpaceTree.FocudNodeChanged += new DevExpress.XtraTreeList.FocudNodeChangedEventHandler(this.WorkSpaceTree_FocudNodeCh
anged);
当然我们可以通过属性⾯板⾥的事件⾯板⾃动增加事件处理。
在事件处理函数⾥有2种⽅式取数据。
/**
* ⼯作区选中事件
* */
private void WorkSpaceTree_FocudNodeChanged(object nder, DevExpress.XtraTreeList.FocudNodeChangedEventArgs e)
{
TreeList workSpaceTree = nder as TreeList;
TreeListNode node = workSpaceTree.FocudNode;
if (null != node)
{
//⽅法⼀:通过GetDataRecordByNode获取结点数据集
DataRowView drv = workSpaceTree.GetDataRecordByNode(node) as DataRowView;
string uid = (string)drv["uid"];
string objectName= (string)drv["objectName"];
//⽅法⼆:通过GetDisplayText取得显⽰⽂件
workspaceSelectedUid = node.GetDisplayText("uid");
workspaceSelectedCtype = node.GetDisplayText("objectName");
车辆改色}
}
获得⾏的数据集
DataRowView drv = workSpaceTree.GetDataRecordByNode(node) as DataRowView;
string uid = (string)drv["uid"];
string objectName= (string)drv["objectName"];
刷新数据以及控制选中
有时候我们需要从后台重新请求数据并显⽰,或者我们主动控制哪个结点被选中。
假如WorkspaceRootVo result = HttpUtil.WorkspaceUrl(GlobalData.ini.ReadValue(“home”)));是我们请求后台的接⼝⽅法。
刷新树型⽅法如下:
private void refreshTree()
{
workSpaceTree.ClearNodes();
WorkspaceRootVo result = HttpUtil.GetRespon<WorkspaceRootVo>(WorkspaceUrl(GlobalData.ini.ReadValue("home")));
LoadData(result);
}
家乡的什么作文
控制选中⽅法如下:
//调⽤testSetTreeSelect⽅法
private void  test(){
testSetTreeSelect(this.workSpaceTree.Nodes, "515117932112510976");
}
//lectedUid是选中的结点Uid
private Boolean testSetTreeSelect(TreeListNodes treeListNodes, string lectedUid)
{
if (!string.IsNullOrEmpty(lectedUid))
{
for(int i = 0;i< treeListNodes.Count; i++)
{
TreeListNode treeListNode = treeListNodes[i];
string uid = treeListNode.GetDisplayText("uid");
if (!string.IsNullOrEmpty(uid))
{
if(uid == lectedUid)
{
treeListNode.Selected = true;
return true;
}
el
{
treeListNode.Selected = fal;
}
}
if (treeListNode.Nodes.Count > 0)
{
Boolean re = testSetTreeSelect(treeListNode.Nodes, lectedUid);
if (re)
{
return true;
}
}
}
}
return fal;
}
我这⾥使⽤Uid做唯⼀标识,如果有其它参数唯⼀,也可以⽤来判断。通过遍历树下所有结点,通过唯⼀的uid⽐较,选中使⽤treeListNode.Selected = true;,不选中treeListNode.Selected = fal;
CheckState与Selected
这2属性意思不⼀样。CheckState是在有复杂框情况下选中是否,事实上,它的“选中”和Selected的“选中”不是⼀个选中,Selected是唯⼀的,表⽰当前某个结点被“选中”,⽽CheckState表达的是“选择”的意思。
TreeList带有CheckBox,并且节点要有三种状态(所有的⼦节点都选中,所有的⼦节点都没选择,⼀部分⼦节点选中)。TreeList.OptionsView.ShowCheckBoxes = true :是否显⽰CheckBox
TreeList.OptionsBehavior.AllowIndeterminateCheckState = true :设置节点是否有中间状态,即⼀部分⼦节点选中,⼀部分⼦节点没有选中设置这两个属性之后就实现了TreeList带有CheckBox,并且节点有三种状态。
复选框的⼦节点与⽗节点统⼀的规则有:
1.  选择某⼀节点时,该节点的⼦节点全部选择
2.  取消某⼀节点时,该节点的⼦节点全部取消选择
3. 某节点的⼦节点全部选择时,该节点选择
4. 某节点的⼦节点未全部选择时,该节点不选择
代码如下

本文发布于:2023-06-17 20:52:49,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/978214.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:节点   数据   选中   选择
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图