数据表生成无级树,刚发布,地址:http://blog.csdn.net/xianfajushi/article/details/7756584优点:任意定义树节顺序与级数,无无限循环之忧,速度比递归快。求败要求:发现树节错误,发现无法读取语法错误。注明:目前不支持日期型数据和金额类数据进行筛选,需要的话自己写,或以后有遇到需求再补充。欢迎测试指正,不吝赐教,不拒砸蛋丢菜。

解决方案 »

  1.   

    哈哈楼上诸位讨论我用中文,这是一个值得探讨的问题?在我认为那是无聊之辈愚见,不值挂齿。
    在我看来,所有文字只是符号而已,没什么区别,如果从启蒙开始就教人读:a(啊)A(霭)多种发音,这就成了习惯而自然而然的了,只不过是一个符号多种发言,中国符号(是)和英国符号(Yas)或者其他国家符号表达同一个意思而已,写到这里我想起福尔摩斯里面的符号解密的符号游戏,呵呵。
    我写语句随心所欲,不受拘束,只要看语句时能清晰引导对逻辑分析有帮助,很自然就成自己习惯了,就算再大项目用中文写我也有这胆量。
    不仅语句用中文,数据库名、字段都用中文,这些都不必提,关键问题是程序编译都运行正常;没必要关心中间变为那种符号,和最终都是0、1机器符号;我所关心的是自己方便,运行正常,随心所欲,不束缚自己,至于别人怎么想、怎么看、怎么说都不关我的事,那是当事人自己关心的,我没心思与此无聊之辈再胡扯什么。
      

  2.   

    LZ悲剧了、
    人家只是想讨论下技术、
    没想到你们全抓"伪"bug去了、
      

  3.   

    代码看不下去,实在有点难接受中文变量名,但是lz你用也没啥不好的。
    不过用中文表字段名的时候建议加"[]",因为有时候有些数据库中间件或本身对中文支持没那么好。
    之前拿到gis数据后我这边一个gis控件不支持中文表明结果很麻烦的修改了字段名。
    可能的话生僻数据库还是沿用英文字段名。注意加上[]分隔符吧。
      

  4.   

     我还真认真的看了,LZ这是个坑啊,中文不适感就不说了,表结构没给,上来就一个datatable开始循环,又冒出个级的概念来,不知道,级在什么地方出来的,是表的级联查询出的级么,也不解释,“子龙”“母龙”什么蛋疼啊。上来就
    节点.Text = 数据列[0].ToString();          if (!DateTime.TryParse(节点.Text, out 日期)) 子节数据 = 树表.Select(重组表列[0] + "='" + 节点.Text + "'");  数据列【0】是毛数据没说,为什么要判断 节点.Text 是否能成功转日期也不提,子节数据是所谓的树表select出来的,树表是数据表中的内容的defalutview.totable来的,表列是根据表名做的判断,所以其中的数据列【0】是所谓的“归属”“提示内容”“总类”,根据这个来的,我权且当它是个父节点id的意思吧。到了下面我就完败了,完全不知所谓。=======================说说我常用的非递归树生成,我通常是用oracle中的级联查询树表,来出一个树,来一个堆栈记录下当前父节点的全路径,循环一次完事。.net代码不超过三十行,缺点是兄弟节点的排序问题我没解决。我对级联查询研究的还不够啊.....有知道的告知一下
      

  5.   

    额,不多说啥,先上一段代码,lz比较一下差距有多大  public static void makeTreeView<TSource, TID, TNode>(
               this IEnumerable<TSource> list,
               IEnumerable tds,        
               Func<TSource, TID> FunID,
               Func<TSource, TID> funParentID,
               Func<TSource, TNode> funConvert,  
                Func<TNode, IEnumerable> ChirldFun,
               decimal parentId = 0
               ) where TID : struct
            {            var tlist = list.Where(c => Convert.ToDecimal(funParentID(c)) == parentId);
                foreach (var item in tlist)
                {
                    TNode td = funConvert(item);
                    dynamic d_tds = tds;
                    d_tds.Add(td);
                    list.makeTreeView(ChirldFun(td), FunID, funParentID, funConvert, ChirldFun,Convert.ToDecimal(FunID(item)));
                }
            }
      

  6.   


    你用Linq,楼主没用,你能让他服你就见鬼了。。
      

  7.   

    说一下正题,表结构看http://blog.csdn.net/xianfajushi/article/details/7745501
    不论表是怎么来的,只要要对表内容进行树显示,就自定义要显示的字段,不论什么字段,这正是要测试的;
    不论字段是什么符号,对于编程的人来说,我有必要去担忧?
    节点.Text = 数据列[0].ToString();
    数据列[0].ToString();难道没看到是来自筛选的表?这是什么疑问!41楼提问的,我正等待有人告诉我有多大差距的结果呢。if (!DateTime.TryParse(节点.Text, out 日期)) 子节数据 = 树表.Select(重组表列[0] + "='" + 节点.Text + "'");  这个也需要我解释?那好吧,就是已经说过的,不支持日期筛选,特意加的。
      

  8.   

    呵呵,几十次递归效率能差到哪里去?或说能高到什么地方去? 递归为什么会存在?你这个代表只怕连递归的效率都不如, 看到几级个For循环,头晕了,代码不仅要效率高,还要以兼顾到可读性,你这个可读性差的就不是一点半点了,用中文没啥不可以,只不过大部分的程序员,仍然以英文为编程习惯,看到中文会很不适应。
      

  9.   

    楼主对中文这么有兴趣,那就应该把if,for...类似的关键字用扩展方法给替换掉,比如
    static class 中文
        {
            public delegate void 执行<类型>(类型 值);
            public static void 如果<类型>(this 类型 值, 执行<类型> 执行)
            {
                if (!值.Equals(default(类型))) 执行(值);
            }
            public static void 如果不<类型>(this 类型 值, 执行<类型> 执行)
            {
                if (值.Equals(default(类型))) 执行(值);
            }
            public static void 如果<类型>(this 类型 值, 类型 比较值, 执行<类型> 执行) where 类型 : IEquatable<类型>
            {
                if (值.Equals(比较值)) 执行(值);
            }
            public static void 如果不<类型>(this 类型 值, 类型 比较值, 执行<类型> 执行) where 类型 : IEquatable<类型>
            {
                if (!值.Equals(比较值)) 执行(值);
            }
        }
    那么调用的时候就直接 ?.如果(值 => ...)我怎么感觉我在犯罪呢
      

  10.   

    http://topic.csdn.net/u/20120203/11/020CC783-B9AC-4674-AB2E-A646770205BE.html
      

  11.   

    俗语道:耳听为虚,眼见为实;事实胜于雄辩。        private DataTable 测试九九表树()
            {
                /*创建测试九九表、设置表名、列名*/
                DataTable 测试九九表 = new DataTable(); 测试九九表.TableName = "测试树表"; 测试九九表.Columns.Add("九九表");
                for (int 表头序 = 1; 表头序 <= 9; 表头序++) { 测试九九表.Columns.Add(表头序.ToString()); }
                /*添加行数据*/
                for (int i = 1; i <= 9; i++)
                {
                    DataRow 测试树表列 = 测试九九表.NewRow();
                    测试树表列[0] = "九九表";
                    for (int j = 1; j <= 9; j++)
                    { 测试树表列[j] = i.ToString() + "×" + j.ToString() + "=" + (i * j).ToString(); }
                    测试九九表.Rows.Add(测试树表列);
                }
                return 测试九九表;
            }
    凡与37楼同论者真的亢龙有悔啊。哈哈
      

  12.   


    英文即使不懂一眼扫过去就知道是见过的哪个,而中文则意识里先读出意思,然后在找相同的中文,然后再读出意思,这就是我们感觉怪异的所在。如看到一个Table,我们知道它是表这个概念,但不会去想它是个表,再次看到还是一样,并且很直觉的就会知道它们是同一个事物,但是看到中文表字,就会先去想它是个表,然后去找到下一个表,然后再想它是表,甚至还会去对比一下,两个表是否真的表示一个事物,最后才知道它们确实是一个
      

  13.   

    select level,id,pid from mytable start with pid is null connect by prior id = pid;用个堆栈记录当前树的父结点,然后一个循环搞定,不超过30行
      

  14.   

    我的手真贱,点击了那个链接!~瞄了一眼果断速度马上即刻按了下ALT+F4!楼主已经无敌了
      

  15.   

    对刚出炉的代码只用TEXT作为判断确实心存疑虑,反复思考、构思及运行测试,最终打消了对多循环不愿意使用的疑虑,最终大胆采用5个循环,调试发现这5个循环不会造成不良后果,采用节路径作为判断是最合理的,从而彻底打破可能存在漏洞,这回彻底安心了,似乎可以终结了,再运行一段时间后再来结贴。
    本代码无论多少级只有5个循环,比起递归或其他的循环不知少了多少循环和排序。