数据表生成无级树,刚发布,地址:http://blog.csdn.net/xianfajushi/article/details/7756584优点:任意定义树节顺序与级数,无无限循环之忧,速度比递归快。求败要求:发现树节错误,发现无法读取语法错误。注明:目前不支持日期型数据和金额类数据进行筛选,需要的话自己写,或以后有遇到需求再补充。欢迎测试指正,不吝赐教,不拒砸蛋丢菜。
调试欢乐多
在我看来,所有文字只是符号而已,没什么区别,如果从启蒙开始就教人读:a(啊)A(霭)多种发音,这就成了习惯而自然而然的了,只不过是一个符号多种发言,中国符号(是)和英国符号(Yas)或者其他国家符号表达同一个意思而已,写到这里我想起福尔摩斯里面的符号解密的符号游戏,呵呵。
我写语句随心所欲,不受拘束,只要看语句时能清晰引导对逻辑分析有帮助,很自然就成自己习惯了,就算再大项目用中文写我也有这胆量。
不仅语句用中文,数据库名、字段都用中文,这些都不必提,关键问题是程序编译都运行正常;没必要关心中间变为那种符号,和最终都是0、1机器符号;我所关心的是自己方便,运行正常,随心所欲,不束缚自己,至于别人怎么想、怎么看、怎么说都不关我的事,那是当事人自己关心的,我没心思与此无聊之辈再胡扯什么。
人家只是想讨论下技术、
没想到你们全抓"伪"bug去了、
不过用中文表字段名的时候建议加"[]",因为有时候有些数据库中间件或本身对中文支持没那么好。
之前拿到gis数据后我这边一个gis控件不支持中文表明结果很麻烦的修改了字段名。
可能的话生僻数据库还是沿用英文字段名。注意加上[]分隔符吧。
节点.Text = 数据列[0].ToString(); if (!DateTime.TryParse(节点.Text, out 日期)) 子节数据 = 树表.Select(重组表列[0] + "='" + 节点.Text + "'"); 数据列【0】是毛数据没说,为什么要判断 节点.Text 是否能成功转日期也不提,子节数据是所谓的树表select出来的,树表是数据表中的内容的defalutview.totable来的,表列是根据表名做的判断,所以其中的数据列【0】是所谓的“归属”“提示内容”“总类”,根据这个来的,我权且当它是个父节点id的意思吧。到了下面我就完败了,完全不知所谓。=======================说说我常用的非递归树生成,我通常是用oracle中的级联查询树表,来出一个树,来一个堆栈记录下当前父节点的全路径,循环一次完事。.net代码不超过三十行,缺点是兄弟节点的排序问题我没解决。我对级联查询研究的还不够啊.....有知道的告知一下
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)));
}
}
你用Linq,楼主没用,你能让他服你就见鬼了。。
不论表是怎么来的,只要要对表内容进行树显示,就自定义要显示的字段,不论什么字段,这正是要测试的;
不论字段是什么符号,对于编程的人来说,我有必要去担忧?
节点.Text = 数据列[0].ToString();
数据列[0].ToString();难道没看到是来自筛选的表?这是什么疑问!41楼提问的,我正等待有人告诉我有多大差距的结果呢。if (!DateTime.TryParse(节点.Text, out 日期)) 子节数据 = 树表.Select(重组表列[0] + "='" + 节点.Text + "'"); 这个也需要我解释?那好吧,就是已经说过的,不支持日期筛选,特意加的。
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(比较值)) 执行(值);
}
}
那么调用的时候就直接 ?.如果(值 => ...)我怎么感觉我在犯罪呢
{
/*创建测试九九表、设置表名、列名*/
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楼同论者真的亢龙有悔啊。哈哈
英文即使不懂一眼扫过去就知道是见过的哪个,而中文则意识里先读出意思,然后在找相同的中文,然后再读出意思,这就是我们感觉怪异的所在。如看到一个Table,我们知道它是表这个概念,但不会去想它是个表,再次看到还是一样,并且很直觉的就会知道它们是同一个事物,但是看到中文表字,就会先去想它是个表,然后去找到下一个表,然后再想它是表,甚至还会去对比一下,两个表是否真的表示一个事物,最后才知道它们确实是一个
本代码无论多少级只有5个循环,比起递归或其他的循环不知少了多少循环和排序。