[DevExpress]TreeList控件的复选框

        TreeList控件可以同时显示树结构和其他数据列,即在一个列上建立父子关系展开或收缩,同时还可以显示其他列的内容。
        在TreeList中同时引入了 Node和 Columns概念, 第一列为树结构, 其余列为数据列, 任何列都可作为树结构列(即拖动到第一列)显示。
实现多级树---数据源绑定
        在TreeList里添加要显示列(第一列为树结构,其他列为数据列),并指定FieldName为数据库列名
        指定KeyFieldName属性为主键,ParentFieldName属性为树状分组列。注意 ParentFieldName指定的列如果为空值,树状可能会混乱(只有一个根结点,其他为此节点的子结点)
        用TreeList.DataSource = DataTable 绑定数据即可
树形控件是使用频率很高的一种控件。对于属性控件往往需要下面两个功能:
        1.TreeList带有CheckBox,并且节点要有三种状态(所有的子节点都选中,所有的子节点都没选择,一部分子节点选中)。使用DevXpress的TreeList控件很容易实现这一功能。
        设置TreeList.OptionsView.ShowCheckBoxes = true //是否显示CheckBox
        设置TreeList.OptionsBehavior.AllowIndeterminateCheckState = true; //设置节点是否有中间状态,即一部分子节点选中,一部分子节点没有选中
设置这两个属性之后就实现了TreeList带有CheckBox,并且节点有三种状态。
        2.选中父节点或者子节点相互影响的功能,如选择父节点选择所有子节点。绑定TreeList的两个事件AfterCheckNode和BeforeCheckNode
DevExpress的TreeList要想在节点前面显示复选框,得修改属性OptionsView->ShowCheckBoxes=True
复选框的子节点与父节点统一的规则有:
        1、选择某一节点时,该节点的子节点全部选择
        2、取消某一节点时,该节点的子节点全部取消选择
        3、某节点的子节点全部选择时,该节点选择
        4、某节点的子节点未全部选择时,该节点不选择

[csharp]  view plain  copy
 
  1. #region 节点选中前事件  
  2.  private void treeList1_BeforeCheckNode(object sender, DevExpress.XtraTreeList.CheckNodeEventArgs e)  
  3.  {  
  4.      if (e.PrevState == CheckState.Checked)  
  5.      {  
  6.          e.State = CheckState.Unchecked;  
  7.      }  
  8.      else  
  9.      {  
  10.          e.State = CheckState.Checked;  
  11.      }  
  12.  }  
  13.  #endregion  
  14.  
  15.  #region 节点选中后事件  
  16.  private void treeList1_AfterCheckNode(object sender, DevExpress.XtraTreeList.NodeEventArgs e)  
  17.  {  
  18.      SetCheckedChildNodes(e.Node, e.Node.CheckState);  
  19.      SetCheckedParentNodes(e.Node, e.Node.CheckState);  
  20.  }  
  21.  #endregion  
  22.  
  23.  #region 设置子节点状态  
  24.  private void SetCheckedChildNodes(DevExpress.XtraTreeList.Nodes.TreeListNode node, CheckState check)  
  25.  {  
  26.      for (int i = 0; i < node.Nodes.Count; i++)  
  27.      {  
  28.          node.Nodes[i].CheckState = check;  
  29.          SetCheckedChildNodes(node.Nodes[i], check);  
  30.      }  
  31.  }  
  32.  #endregion  
  33.  
  34.  #region 设置父节点状态  
  35.  private void SetCheckedParentNodes(DevExpress.XtraTreeList.Nodes.TreeListNode node, CheckState check)  
  36.  {  
  37.      if (node.ParentNode != null)  
  38.      {  
  39.          bool b = false;  
  40.          CheckState state;  
  41.          for (int i = 0; i < node.ParentNode.Nodes.Count; i++)  
  42.          {  
  43.              state = (CheckState)node.ParentNode.Nodes[i].CheckState;  
  44.              if (!check.Equals(state))  
  45.              {  
  46.                  b = !b;  
  47.                  break;  
  48.              }  
  49.          }  
  50.          if (b)  
  51.          {  
  52.              node.ParentNode.CheckState = CheckState.Indeterminate;  
  53.          }  
  54.          else  
  55.          {  
  56.              node.ParentNode.CheckState = check;  
  57.          }  
  58.          SetCheckedParentNodes(node.ParentNode, check);  
  59.      }  
  60.  }  
  61.  #endregion  

你可能感兴趣的:([DevExpress]TreeList控件的复选框)