DevExpress的TreeList要想在节点前面显示复选框,得修改属性OptionsView->ShowCheckBoxes=True
复选框的子节点与父节点统一的规则有:
1,选择某一节点时,该节点的子节点全部选择
2,取消某一节点时,该节点的子节点全部取消选择
3,某节点的子节点全部选择时,该节点选择
4,某节点的子节点未全部选择时,该节点不选择
private void treeList1_AfterCheckNode(object sender, NodeEventArgs e) { SetCheckedChildNodes(e.Node, e.Node.CheckState); SetCheckedParentNodes(e.Node, e.Node.CheckState); } private void treeList1_BeforeCheckNode(object sender, CheckNodeEventArgs e) { e.State = (e.PrevState == CheckState.Checked ? CheckState.Unchecked : CheckState.Checked); } private void SetCheckedChildNodes(TreeListNode node, CheckState check) { for(int i = 0; i < node.Nodes.Count; i++) { node.Nodes[i].CheckState = check; SetCheckedChildNodes(node.Nodes[i], check); } } private void SetCheckedParentNodes(TreeListNode node, CheckState check) { if(node.ParentNode != null) { bool b = false; CheckState state; for(int i = 0; i < node.ParentNode.Nodes.Count; i++) { state = (CheckState)node.ParentNode.Nodes[i].CheckState; if(!check.Equals(state)) { b = !b; break; } } node.ParentNode.CheckState = b ? CheckState.Indeterminate : check; SetCheckedParentNodes(node.ParentNode, check); } }
private void GetCheckedID(TreeListNode parentNode) { if (parentNode.Nodes.Count == 0) { return;//递归终止 }
foreach (TreeListNode node in parentNode.Nodes) { if (node.CheckState == CheckState.Checked) { DataRowView drv = treeList1.GetDataRecordByNode(node) as DataRowView;//关键代码 if (drv != null) { int GroupID= (int)drv["GroupID"]; lstCheckedOfficeID.Add(GroupID); }
private void btnOK_Click(object sender, EventArgs e) { this.lstCheckedOfficeID.Clear();
if (treeList1.Nodes.Count > 0) { foreach (TreeListNode root in treeList1.Nodes) { GetCheckedOfficeID(root); } }
string idStr = string.Empty; foreach (int id in lstCheckedOfficeID) { idStr += id + " "; }
}
} GetCheckedOfficeID(node); } }
|