使用递归获取TreeList中所有勾选的结点
作者:C/S框架网  发布日期:2011/06/26 22:13:41
使用递归获取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:
点击下载附件 点击下载附件 (如下载失败,请邮件通知我们寄回给您,或QQ:23404761留言.)
上一篇 下一篇