dev treelist 常用用法小結
阿新 • • 發佈:2018-12-30
要求如下:
1:選擇父節點後,子節點全部打鉤;2:選擇子節點而不選擇父節點,則從當前節點的父節點一直到根節點check框都是半選狀態。
3:當子節點均未勾選時,設定父節點狀態為:未選中狀態
具體實現如下:
一、OptionView—ShowCheckBoxes屬性為true,則每個節點前面自動增加一個check框。
二、設定OptionBehavior—AllIndeterminateCheckState屬性為true,則check框可以出現半選狀態。
具體程式碼顯示如下:
#region 樹形 點選節點前 /// <summary> /// 點選節點前 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void treeList_BeforeCheckNode(object sender, CheckNodeEventArgs e) { if (!this.ifMultipleChoice) { //選擇前取消前面已經選擇的,實現單選功能 List<DevExpress.XtraTreeList.Nodes.TreeListNode> treeListNodes = treeList.GetAllCheckedNodes(); foreach (DevExpress.XtraTreeList.Nodes.TreeListNode node in treeListNodes) { node.Checked = false; } } e.State = (e.PrevState == CheckState.Checked ? CheckState.Unchecked : CheckState.Checked); } #endregion #region 樹形 點選節點後 /// <summary> /// 點選節點後 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void treeList_AfterCheckNode(object sender, NodeEventArgs e) { if (!this.ifMultipleChoice) { return; } if (e.Node == null) { return; } if (e.Node.CheckState == CheckState.Indeterminate) { e.Node.CheckState = CheckState.Checked; } if (e.Node.CheckState == CheckState.Checked) { if (e.Node.HasChildren) { this.CheckNode(e.Node); } this.ValidParentIsChecked(e.Node); } else if (e.Node.CheckState == CheckState.Unchecked) { if (e.Node.HasChildren) { this.SetCheckedChildNodes(e.Node, CheckState.Unchecked); } //從根節點往下 查詢 是否有打鉤的子節點,如果有那麼 父節點的 半選狀態不變 否則變為 不選擇狀態 //this.ValidParentNodeIsCanleSel(e.Node); SetCheckedParentNodes(e.Node, e.Node.CheckState); } } #endregion #region 樹形 節點操作集合 /// <summary> /// 選擇某個節點及其子節點 /// </summary> /// <param name="node"></param> private void CheckNode(DevExpress.XtraTreeList.Nodes.TreeListNode node) { foreach (DevExpress.XtraTreeList.Nodes.TreeListNode cnode in node.Nodes) { if (cnode != null) { cnode.CheckState = CheckState.Checked; } if (cnode.HasChildren) { CheckNode(cnode); } } } /// <summary> /// 勾選子節點後,修改父節點的狀態 /// </summary> /// <param name="node"></param> private void ValidParentIsChecked(DevExpress.XtraTreeList.Nodes.TreeListNode node) { if (node.ParentNode != null) { //父節點未被選中 if (node.ParentNode.CheckState == CheckState.Unchecked) { //該節點有子節點 並且 該節點與子節點均被選中 if (node.HasChildren && ValidIsCheckAllChildNode(node.ParentNode)) { node.ParentNode.CheckState = CheckState.Checked; } //該節點沒有子節點 並且 其父節點下的子節點均被選中 else if ((!node.HasChildren) && ValidIsCheckAllChildNode(node.ParentNode)) { node.ParentNode.CheckState = CheckState.Checked; } else { node.ParentNode.CheckState = CheckState.Indeterminate; } } else if (node.ParentNode.CheckState == CheckState.Indeterminate) { //該節點有子節點並且 子節點均未被選中時,修改其狀態 if (node.HasChildren && (!this.ValidIsHasCheckChildNode(node))) { node.ParentNode.CheckState = CheckState.Unchecked; } // 該節點的父節點下所有節點均被選中 ValidIsCheckAllChildNode else if (ValidIsCheckAllChildNode(node.ParentNode)) { node.ParentNode.CheckState = CheckState.Checked; } } this.ValidParentIsChecked(node.ParentNode); } } /// <summary> /// 從該節點往下 查詢 是否有打鉤的子節點,如果有那麼 父節點的 半選、選中狀態不變否則變為 不選擇狀態 /// </summary> /// <param name="node"></param> private void ValidParentNodeIsCanleSel(DevExpress.XtraTreeList.Nodes.TreeListNode node) { bool isSel = false; if (node.ParentNode != null) { if (node.ParentNode.CheckState == CheckState.Indeterminate) { //如果父節點的 狀態為 半選 狀態 這 根據父節點 判斷子節點是否打鉤 isSel = ValidIsHasCheckChildNode(node.ParentNode); if (isSel == false) { //如果所有的 子節點 都沒有 “選中”那麼 父節點的狀態 變為 非選中狀態 node.ParentNode.CheckState = CheckState.Unchecked; } } this.ValidParentNodeIsCanleSel(node.ParentNode); } } /// <summary> /// 判斷該節點下是否有節點被選中,如果有返回true /// </summary> /// <param name="node"></param> /// <returns></returns> private bool ValidIsHasCheckChildNode(DevExpress.XtraTreeList.Nodes.TreeListNode node) { bool isCheck = false; foreach (DevExpress.XtraTreeList.Nodes.TreeListNode cnode in node.Nodes) { if (cnode != null) { if (cnode.CheckState == CheckState.Checked) { isCheck = true; return isCheck; } } if (cnode.HasChildren) { isCheck = this.ValidIsHasCheckChildNode(cnode); if (isCheck == true) { return isCheck; } } } return isCheck; } /// <summary> /// 節點全選 /// </summary> /// <param name="node"></param> /// <returns></returns> private bool ValidIsCheckAllChildNode(DevExpress.XtraTreeList.Nodes.TreeListNode node) { bool isCheck = true; foreach (DevExpress.XtraTreeList.Nodes.TreeListNode cnode in node.Nodes) { if (cnode != null) { if (cnode.CheckState == CheckState.Unchecked) { isCheck = false; return isCheck; } } if (cnode.HasChildren) { isCheck = this.ValidIsCheckAllChildNode(cnode); if (isCheck == false) { return isCheck; } } } return isCheck; } #endregion #region 樹形 獲取全部子節點 private void GetChildNodes(TreeListNode parentNode, List<TreeListNode> list) { if (parentNode == null) { return; } if (parentNode.Nodes.Count > 0) { foreach (TreeListNode node in parentNode.Nodes) { list.Add(node); if (node.Nodes.Count > 0) { GetChildNodes(node, list); } } } } #endregion #region 樹形 選擇子節點時觸發 /// <summary> /// 選擇子節點時觸發 /// </summary> /// <param name="node"></param> /// <param name="check"></param> private void SetCheckedChildNodes(TreeListNode node, CheckState check) { foreach (TreeListNode tn in node.Nodes) { tn.CheckState = check; if (tn.HasChildren) { SetCheckedChildNodes(tn, check); } } } #endregion #region 樹形 選擇父節點時觸發 /// <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; foreach (TreeListNode tln in node.ParentNode.Nodes) { state = (CheckState)tln.CheckState; if (!check.Equals(state)) { b = !b; break; } } node.ParentNode.CheckState = b ? CheckState.Indeterminate : check; SetCheckedParentNodes(node.ParentNode, check); } } #endregion #region 樹形 判斷此節點下的所有孩子節點是否選中 /// <summary> /// 判斷此節點下的所有孩子節點是否選中 /// </summary> /// <param name="node"></param> /// <returns></returns> private Boolean IsChildsChecked(TreeListNode node) { foreach (TreeListNode tln in node.ParentNode.Nodes) { if (tln.CheckState == CheckState.Unchecked) { return false; } if (tln.HasChildren) { IsChildsChecked(tln); } } return true; } #endregion