从DataTable加载树形控件

来源:互联网 发布:p2p流媒体直播软件 编辑:程序博客网 时间:2024/05/04 19:38

这个问题。在家可能首先想到递归。关于递归我就不说了。

有一个DataTable 有三列 fnodeid,fparentid,fname分别表示节点编号,父节点编号,显示名称

现在看一下递归代码

 public bool buildTree(TreeView TreeViewName, DataTable dt)
        {

            foreach (DataRow dbRow in dt.Rows)
            {
                if (dbRow["FparentId"].ToString() == "" )
                {
                    dbRow["FparentId"] = DBNull.Value;
                    break;
                }
            }


           dt.ChildRelations.Add("myrel", dt.Columns["fnodeid"], dt.Columns["fparentid"]);


            foreach (DataRow dbRow in dt.Rows)
            {
                if (dbRow.IsNull("FparentId"))
                {
                    TreeNode newNode = CreateNode(dbRow);
                    TreeViewName.Nodes.Add(newNode);
                    PopulateSubTree(dbRow, newNode);
                }
            }

            return true;

        }
        private void PopulateSubTree(DataRow dbRow, TreeNode node)
        {
            foreach (DataRow childRow in dbRow.GetChildRows("myrel"))
            {
                TreeNode childNode = CreateNode(childRow);
                node.Nodes.Add(childNode);
                PopulateSubTree(childRow, childNode);
            }
        }
 
        private TreeNode CreateNode(DataRow rowa)
        {
            TreeNode node = new TreeNode(rowa["fname"].ToString());
          
            return node;
        }

 

一下子弄了几个方法。。好烦呀。。我的表里有1400行数据用了110多毫秒。我的机器还可以。。

 

有点慢。我又想了一个。。

 

   public static void FillTree(DataTable dt, TreeView tv, string rootparent, string fp, string fc,string ftext)
        {
            Dictionary<string, TreeNode> dic = new Dictionary<string, TreeNode>(dt.Rows.Count);
            foreach(DataRow row in dt.Rows)
            {
                TreeNode nod = new TreeNode(row[ftext].ToString()){Tag = row[fp].ToString()};
                if (row[fp].ToString() == rootparent )
                {
                    tv.Nodes.Add(nod);
                }
                dic.Add(row[fc].ToString(), nod);

            }
            foreach (TreeNode n in dic.Values)
            {
                if (dic.ContainsKey(n.Tag.ToString()))
                {
                    dic[n.Tag.ToString()].Nodes.Add(n);
                }
            }
           
        } 

利用字典。。只要两个循环就搞定了。时间只用了36毫秒。

一些细节就不加了。

如果哪位有更好方法,不防也分享一下