使用递归获取TreeList中所有勾选的结点
DevExpress 的TreeList与.Net的TreeView有很大差异,DevExpress的TreeList实际上是一张拥有树特性的二维表。
TreeListNode的数据存储是对象数组,数组里每个元素对应一个Column,所以在设计时必须定义一个
Column,如上图的"部门列表",列头是可以隐藏的。
获取结点的文本是通过:node.GetValue(0),0表示ColumnIndex,是第一列。刚才在写作时找狂找
Text和Caption属性,后来才想到TreeListNode是对象数组,只有通过获取数组中列元素显示标题。
剃归写法:
/// <summary>
/// 使用递归获取TreeList中所有勾选的结点。
/// </summary>
public class Recursion
{
/// <summary>
/// 枚举树中所有结点。
/// </summary>
/// <param name="tree"></param>
/// <returns></returns>
public IList GetCheckNodes(TreeList tree)
{
//用于存储勾选的结点
IList list = new ArrayList();
//首长循环获取已勾选的根结点
foreach (TreeListNode n in tree.Nodes)
{
if (n.Checked) list.Add(new MyNodeItem(n, "根目录的")); //Checked表示勾选
//如果当前结点有子结点集合,再枚举所有子结点
if (n.Nodes.Count > 0)
this.DoGetCheckNodes(list, n);
}
return list;
}
/// <summary>
/// 剃归,扫描所有结点。
/// </summary>
/// <param name="list"></param>
/// <param name="parentNode"></param>
private void DoGetCheckNodes(IList list, TreeListNode parentNode)
{
//枚举当前结点的所有子结点
foreach (TreeListNode n in parentNode.Nodes)
{
if (n.Checked) list.Add(new MyNodeItem(n, "子目录"));
//如果当前结点有子结点集合,再枚举所有子结点
if (n.Nodes.Count > 0)
this.DoGetCheckNodes(list, n);
}
}
}
定义了一个用于存储在ListBoxItemCollection集合中自定义对象
/// <summary>
/// 用于存储在ListBoxItemCollection集合中自定义对象
/// 这是一种非常适用的写法,通过扩展MyNodeItem,可以存储大量定制的信息。
/// 通过重写ToString()方法,在ListBox控件中可以显示自定的信息。
/// </summary>
public class MyNodeItem
{
TreeListNode _n;
string _tag;
public MyNodeItem(TreeListNode n, string tag)
{
_n = n;
_tag = tag;
}
public override string ToString()
{
return _n.GetValue(0).ToString() + "(" + _tag + ")";
}
}
获取结点然后显示:
private void btnGetSelectedNodes_Click(object sender, EventArgs e)
{
IList nodes = new Recursion().GetCheckNodes(this.treeList1);
listBoxControl1.Items.Clear();
foreach (object o in nodes)
listBoxControl1.Items.Add(o);
}
Source code: