DevExpress TreeList 父子节点复选框状态同步

1.给TreeList tlstRegion添加一个自定列(包含)

TreeListColumn IsAll;

RepositoryItemCheckEdit repositoryChk = new RepositoryItemCheckEdit();
chkIsAll.EditValueChanging += chkIsAll_EditValueChanging;
tlstRegion.RepositoryItems.Add(chkIsAll);
this.IsAll.ColumnEdit = chkIsAll; --IsAll是tlstRegion的TreeListColumn

2.给tlstRegion绑定数据

//01.加载区域
tlstRegion.KeyFieldName = "RegionCode";     --关联的子级编号
tlstRegion.ParentFieldName = "ParentCode";  --关联的父级编号

tlstRegion.Nodes.Clear();
CreateNode(new object[] { 0, "区域管理", "0", "", 0, "",false}, 0, true);
LoadTreeData("0", 0, false);

//02.加载树形

private void LoadTreeData(string parentCode, int nodeId, bool isChecked)
{
List<CM_Region> list = _mBusinessCmRegionService.GetRegionListByParentCode(parentCode);
if (list != null && list.Count > 0)
{
foreach (CM_Region item in list)
{
bool hasChildren = _mBusinessCmRegionService.HasChildrenByRegionCode(item.RegionCode);  //判断当前节点是否有子节点
CreateNode(new object[] { item.ID, item.RegionName, item.RegionCode, item.ParentCode, item.RegionLevel, EnumHelper.GetEnumItemDesc(typeof(DataDictionary.Status), item.Status), isChecked }, nodeId, hasChildren);
}
if (parentCode == "0")
{
tlstRegion.Nodes[0].Expanded = true;
}
else
{
if (tlstRegion.FocusedNode != null) { tlstRegion.FocusedNode.Expanded = true; }
}
}
}

//03.创建Node

private void CreateNode(object obj, int nodeId, bool hasChildren)
{
tlstRegion.BeginUnboundLoad();
TreeListNode tln = tlstRegion.AppendNode(obj, nodeId);
tln.HasChildren = hasChildren;
tln.ImageIndex = 1;
tlstRegion.EndUnboundLoad();
}

效果图:

3.TreeList 父子节点"包含"状态同步

在chkIsAll_EditValueChanging事件触发

void chkIsAll_EditValueChanging(object sender, ChangingEventArgs e)
{
if (e.NewValue == null)
{
e.Cancel = true;
return;
}
bool check = DataTypeConvert.ToBoolean(e.NewValue);
TreeListNode node = tlstRegion.FocusedNode;
if (node!=null)
{
node["IsAll"] = check;
}
//01.父节点往下面展开操作
SetCheckedChildNodes(node, check);

//02.字节点往上找
SetCheckedParentNodes(node, check);

}

/// <summary>
/// 全选子节点
/// </summary>
/// <param name="node"></param>
/// <param name="check"></param>
private void SetCheckedChildNodes(TreeListNode node, bool check)
{
for (int i = 0; i < node.Nodes.Count; i++)
{
node.Nodes[i]["IsAll"] = check;
SetCheckedChildNodes(node.Nodes[i], check);
}
}

/// <summary>
/// 父节点
/// </summary>
/// <param name="node"></param>
/// <param name="check"></param>
private void SetCheckedParentNodes(TreeListNode node, bool check)
{
if (node.ParentNode != null)
{
int result = 0;//√
int reuslt1 = 0;//不打√
int result2 = 0;//方块
string parentCheck = node.ParentNode["IsAll"].ToString();//父节点
for (int i = 0; i < node.ParentNode.Nodes.Count; i++)
{
string nodeCheck = node.ParentNode.Nodes[i]["IsAll"].ToString();
if (nodeCheck.ToLower() == "true")
{
result++;
}
else if (nodeCheck.ToLower() == "false")
{
reuslt1++;
}
else
{
result2++;
}
}
if (node.ParentNode.Nodes.Count == result)//01.打√数量和父级数量一致则:父级√
{
node.ParentNode["IsAll"] = true;
}
else if (result > 0)//02.只有有1个打钩:父级为方块
{
node.ParentNode["IsAll"] = CheckState.Indeterminate;
}
else if (node.ParentNode.Nodes.Count == reuslt1)//03.不打√数量和父级数量一致:父级不√
{
node.ParentNode["IsAll"] = false;
}
else if (check && result2 > 0)//04.只要有一个是方块则:父级为方块
{
node.ParentNode["IsAll"] = CheckState.Indeterminate;
}
SetCheckedParentNodes(node.ParentNode, check);
}

效果图:

时间: 2024-07-30 15:34:23

DevExpress TreeList 父子节点复选框状态同步的相关文章

[WinForm][DevExpress][TreeList]父子节点CheckState状态同步

关键代码: /// <summary> ///同步父子节点勾选状态 ///说明 ///在AfterCheckNode事件中使用代码 ///eg:e.Node.SyncNodeCheckState(e.Node.CheckState); /// </summary> /// <param name="node">需要同步的节点</param> /// <param name="check">节点当前勾选状态&

dojo中创建包含节点复选框的树形(CheckBoxTree)

树形结构是界面设计程中常见的部件,在代码实现时有很多方法,但由于设计到节点的父子关系和dom节点操作,实现起来比较复杂.dojo中提供了带复选框的树形部件CheckBoxTree,使用时只需创建对应的实例即可轻松实现此功能. 部件对应的html文件代码如下: <div> <div dojoType="dijit.Dialog" dojoAttachPoint="testList" title="${title}" style=&

DevExpress Gridcontrol 表格头复选框 全选全不选

新建窗体 拖一个Gridcontrol 添加两列 col1,col2 public partial class XtraForm2 : DevExpress.XtraEditors.XtraForm { public XtraForm2() { InitializeComponent(); } private void XtraForm2_Load(object sender, EventArgs e) { //设置复选框 gridView1.OptionsSelection.MultiSele

android listview + checkbox 列表上下滑动导致复选框状态丢失解决办法

以前为这个问题头疼很久.然后去忙其他事情.一直没有去整理,今天好不容易闲下来.就来整整这个listview + checkbox的问题吧 界面: listview_cell: 界面很简单,一个全屏的listview,cell很简单,一个textview一个checkbox activity: package com.example.testlistviewandcheckbox; import java.util.ArrayList; import java.util.List; import

GridView控件通过bit值显示复选框状态

前几天用VS2013做了一个Asp.net下用GridView控件显示数据选中状态的小例子,引发了关于bit的一些新认识. 先简单说说我这个例子吧. 在VS里新建一个web窗体,然后拖入一个GridView控件,绑定Sql Server数据库里的数据源,再通过设置模板添加一个新列.在这个列中加入一个CheckBox控件,然后绑定到数据库里的字段. 开始我设置这个字段的类型为varchar,字段的值为True.False等.绑定后却无法达到想要的效果,即F5后网页内数据库isText字段值为Tru

通过行控制table复选框状态

<el-table @row-click="clickRow" ref="moviesTable" :data="insertModel.tableData"@selection-change="handleSelectionChange"><el-table-column type="selection" width="55"/><el-table-col

Qt树形控件QTreeView使用1——节点的添加删除操作 复选框的设置

QtreeView是ui中最常用的控件,Qt中QTreeWidget比QTreeView更简单,但没有QTreeView那么灵活(QTreeWidget封装的和MFC的CTreeCtrl很类似,没有mvc的特点). 1. QStandardItemModel在QTreeView中的使用 使用QTreeView的对应模型是QStandardItemModel,这个是Qt对应ui界面最有用的模型,它可以用于树形控件.列表控件.表格控件等等和条目有关的控件.QStandardItemModel用于列表

Qt树形列表复选框操作

void CCheckBoxDialog::treeItemsChangeStol(QTreeWidgetItem *pCurrentItem, int){     if (m_itemsCount <= 0)//没有子节点,不存在选中操作     {         updateComboInfoStol();         return;     } if (Qt::Checked == pCurrentItem->checkState(0))     {         //QTree

复选框的勾选与状态判断

复选框的勾选需要通过Dom进行, 状态判断需要通过JqDom进行 复选框勾选: checkbox_dom.checked = true; 复选框状态判断: $(checkbox_dom).is(':checked'); 题外话 -- Dom与JqueryDom的互转: JqDom转Dom Dom = $JqDom.get(0); Dom转JqDom $JqDom = $(Dom);