Devexpress treelist 简介

2019-12-30 15:34:16王旭

6、 某节点的子节点全部选择时,该节点选择;某节点的子节点未全部选择时,该节点不选择     


 /// 某节点的子节点全部选择时,该节点选择  某节点的子节点未全部选择时,该节点不选择
    /// <param name="node"></param>
    /// <param name="check"></param>
    private void SetCheckedParentNodes(TreeListNode node, CheckState check)
    {
      if (node.ParentNode != null)
      {
        CheckState parentCheckState = node.ParentNode.CheckState;
        CheckState nodeCheckState;
        for (int i = 0; i < node.ParentNode.Nodes.Count; i++)
        {
          nodeCheckState = (CheckState)node.ParentNode.Nodes[i].CheckState;
          if (!check.Equals(nodeCheckState))//只要任意一个与其选中状态不一样即父节点状态不全选
          {
            parentCheckState = CheckState.Unchecked;
            break;
          }
          parentCheckState = check;//否则(该节点的兄弟节点选中状态都相同),则父节点选中状态为该节点的选中状态
        }
        node.ParentNode.CheckState = parentCheckState;
        SetCheckedParentNodes(node.ParentNode, check);//遍历上级节点
      }
    }

 上两步写好了,别忘了上面的两个方法在TreeList_AfterCheckNode里面触发: 


private void tlOffice_AfterCheckNode(object sender, DevExpress.XtraTreeList.NodeEventArgs e)
    {
      SetCheckedChildNodes(e.Node, e.Node.CheckState);
      SetCheckedParentNodes(e.Node, e.Node.CheckState);
    }

7、 获取选中的复选框数据列表


 private List<int> lstCheckedOfficeID = new List<int>();//选择局ID集合
    /// 获取选择状态的数据主键ID集合
    /// <param name="parentNode">父级节点</param>
    private void GetCheckedOfficeID(TreeListNode parentNode)
    {
      if (parentNode.Nodes.Count == 0)
      {
        return;//递归终止
      }
      foreach (TreeListNode node in parentNode.Nodes)
      {
        if (node.CheckState == CheckState.Checked)
        {
          DataRowView drv = tlOffice.GetDataRecordByNode(node) as DataRowView;//关键代码,就是不知道是这样获取数据而纠结了很久(鬼知道可以转换为DataRowView啊)
          if (drv != null)
          {
            int OfficeID = (int)drv["OfficeID"];
            lstCheckedOfficeID.Add(OfficeID);
          } 
        }
        GetCheckedOfficeID(node);
      }
    }

  下面测试获取主键列表:


 private void btnCheck_Click(object sender, EventArgs e)
    {
      this.lstCheckedOfficeID.Clear();
      if (tlOffice.Nodes.Count > 0)
      {
        foreach (TreeListNode root in tlOffice.Nodes)
        {
          GetCheckedOfficeID(root);
        }
      }
      string idStr = string.Empty;
      foreach (int id in lstCheckedOfficeID)
      {
        idStr += id + " ";
      }
      MessageBox.Show(idStr);
    }