DevExpress之TreeList用法
在程序开发过程中,TreeList控件的使用频率还是挺高的!本文对一些常用算法进行了一些总结:
1.TreeList数据绑定
TreeList数据绑定采用数据源方式的绑定
TreeList.DataSource=List集合,DataTable,DataSet
绑定之前设置2个基本的绑定属性:KeyFieldName和ParentFieldName
DataSource为对应 的DataTable,指定KeyFieldName为表主键字段,ParentFieldName为表指向主键的外键字段名。
2.TreeList节点
//鼠标单击节点时,获取节点信息
TreeListHitInfo hitinfo = emTreeList.CalcHitInfo(emTreeList.PointToClient(new Point(e.X, e.Y)));
TreeListNode node = hitinfo.Node;//当前点击的节点
//获取emTreeList控件中第一个节点中name的值
emTreeList.Nodes[0].GetValue("name")
//点击节点前触发的时间
privatevoid treeLstModuleAction_BeforeCheckNode(object sender, DevExpress.XtraTreeList.CheckNodeEventArgs e)
{
e.State = (e.PrevState == CheckState.Checked ? CheckState.Unchecked : CheckState.Checked);
}
//点击节点后触发的时间
privatevoid treeLstModuleAction_AfterCheckNode(object sender, DevExpress.XtraTreeList.NodeEventArgs e)
{
SetCheckedChildNodes(e.Node, e.Node.CheckState);
SetCheckedParentNodes(e.Node, e.Node.CheckState);
}
/// 选择子节点时触发
privatevoid SetCheckedChildNodes(TreeListNode node, CheckState check)
{
for (int i =0; i < node.Nodes.Count; i++)
{
node.Nodes[i].CheckState = check;
SetCheckedChildNodes(node.Nodes[i], check);
}
}
/// 选择父节点时触发
privatevoid 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 Boolean IsChildsChecked(TreeListNode node)
{
for (int i =0; i < node.Nodes.Count; i++)
{
if (node.Nodes[i].CheckState == CheckState.Unchecked)
return false;
if (node.Nodes[i].HasChildren)
IsChildsChecked(node.Nodes[i]);
}
return true;
}
////折叠当前节点及其所有子节点
treeListPlate.CollapseAll();
//获取焦点的节点
TreeListNode node = treeListPlate.FocusedNode;
/// 选中后高亮显示
private void treeListPlate_CustomDrawNodeCell(object sender, CustomDrawNodeCellEventArgs e)
{
TreeList node = sender as TreeList;
if (e.Node == node.FocusedNode)
{
e.Graphics.FillRectangle(SystemBrushes.Window, e.Bounds);
Rectangle r = new Rectangle(e.EditViewInfo.ContentRect.Left,
e.EditViewInfo.ContentRect.Top,
Convert.ToInt32(e.Graphics.MeasureString(e.CellText, treeListPlate.Font).Width + 1),
Convert.ToInt32(e.Graphics.MeasureString(e.CellText, treeListPlate.Font).Height));
e.Graphics.FillRectangle(SystemBrushes.Highlight, r);
e.Graphics.DrawString(e.CellText, treeListPlate.Font, SystemBrushes.HighlightText, r);
e.Handled = true;
}
}
关于TreeList中节点的拖拽实现
要实现TreeList控件中节点的拖拽首先将控件中的AllowDrop属性设置为True;
并实现 DragEnter(在用鼠标将某项拖动到该控件的工作区域是发生) 与 DragDrop(拖放操作完成时发生)这2个拖拽事件;
/// <summary> /// 拖拽的节点 /// </summary> private TreeListNode dragNode; /// <summary> /// 原始父节点 /// </summary> private TreeListNode orgParentNode; /// <summary> /// 当前父节点 /// </summary> private TreeListNode pNode = null; private int index; /// <summary> /// 拖拽完成时发生 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void emTreeList_DragDrop(object sender, DragEventArgs e) { //鼠标单击节点时,获取节点信息 TreeListHitInfo hitinfo = emTreeList.CalcHitInfo(emTreeList.PointToClient(new Point(e.X, e.Y))); TreeListNode node = hitinfo.Node;//当前点击的节点 Console.WriteLine(node.GetValue("PUBLISHNAME")); Console.WriteLine("=="+index.ToString()); try { if (null != node && null != dragNode) { if (index == 0) //当前节点的子节点拖拽 { pNode = node; } else //同级别 { pNode = node.ParentNode; } //此处根据需求自己写逻辑 emTreeList.LockReloadNodes(); } } catch (Exception) { MessageBox.Show("当前节点不被允许移动到当前位置!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning); } } private void emTreeList_DragEnter(object sender, DragEventArgs e) { dragNode = emTreeList.FocusedNode; orgParentNode = dragNode.ParentNode; } private void emTreeList_CalcNodeDragImageIndex(object sender, DevExpress.XtraTreeList.CalcNodeDragImageIndexEventArgs e) { index = e.ImageIndex; }