WinFrom Tree控件 子类无限时,数据库如何设计? Tree控件父类下有很多个子类,而子类下又有孙类,孙类下又有孙孙类.就是说,父类下有多少级子类是不定的.那数据库字段怎么设计?[SQL Server 数据库] 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 CREATE TABLE [XXXX]( [Id] [smallint] IDENTITY(1,1) NOT NULL, [Layer] [varchar](1000) COLLATE Chinese_PRC_CI_AS NOT NULL, [Name] [nvarchar](20) COLLATE Chinese_PRC_CI_AS NOT NULL, CONSTRAINT [PK_DEF_ProductCategory] PRIMARY KEY CLUSTERED ( [Id] ASC)--WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY]出来的格式是id Layer Name2 2, 名称13 3, 名称24 4, 名称35 2,5 名称5--该项是 名称1的子项6 2,5,6 名称6--该项是 名称1的子项下 名称5的子项这样的设计好在能用模糊查询当点击父类时能列出对应它下面的项,无论是多少层的 t_id parent_id t_name接点id 上一级接点id 接点名称以树型结构显示时,通过递归即可. id Layer Name 2 2, 名称1 3 3, 名称2 4 4, 名称3 5 2,5 名称5--该项是 名称1的子项 6 2,5,6 名称6--该项是 名称1的子项下 名称5的子项 这样的设计好在能用模糊查询 当点击父类时能列出对应它下面的项,无论是多少层的 提交后移位了 重发 核心列如下:nodeID ------------节点标识parentNodeID ------------父节点标识,如果是根节点为空nodeName ------------节点名称groupID ------------树分组标识(这样可以在表中定义多棵树,而只需指定组号即可,根据组号找出无父节点的根节点,然后递归下去即可)..... idparent_idclassname...id格式 *_*_*_**用数字或字母代替第一级类用 *第二级用*_*这样只需要查询id长度即可知道是否有子类。一张表搞定 id Layer Name 2 2, 名称1 3 3, 名称2 4 4, 名称3 5 2,5 名称5--该项是 名称1的子项 6 2,5,6 名称6--该项是 名称1的子项下 名称5的子项 这样写的话,那Tree控件怎么用代码show出来? 先读出第一层的节点tree.Nodes[0].Nodes.Clear();//下面步骤只是取出第一层的树节点 DataTable table = ListUtility.ConvertToDataTable(ServiceProvider.ProductCategoryService.Search()); for (int i = 0; i < table.Rows.Count; i++) { string[] ling = table.Rows[i]["Layer"].ToString().Split(','); if (ling.Length == 2) { TreeNode tn = new TreeNode(); tn.Text = table.Rows[i]["name"].ToString(); tn.Tag = table.Rows[i]["Layer"]; tree.Nodes[0].Nodes.Add(tn); table.Rows.RemoveAt(i); i--; } }然后用boo控制循环(确保值读出后结束循环)bool boo = true; while (boo) { for (int i = 0; i < table.Rows.Count; i++) { if (digui(tree.Nodes[0], table.Rows[i])) { table.Rows.RemoveAt(i); i--; } if (table.Rows.Count == 0) { boo = false; break; } } if (table.Rows.Count == 0) { boo = false; break; } } tree.ExpandAll();主要的方法体 /// <summary> /// 递归拿值 /// </summary> private bool digui(TreeNode node, DataRow p) { TreeNode tn; foreach (TreeNode no in node.Nodes) { string[] shuzu = no.Tag.ToString().Split(','); string[] shuzu2 = p["layer"].ToString().Split(','); if (shuzu[shuzu.Length - 2].ToString() == shuzu2[shuzu2.Length - 3].ToString()) { tn = new TreeNode(); tn.Text = p["name"].ToString(); tn.Tag = p["Layer"].ToString(); no.Nodes.Add(tn); return true; } else { if (digui(no, p)) { return true; } } } return false; } 还有用以上方法树默认要有一个跟节点 C# 读取网页html源文件问题,在线等! 数据库的连接 卡了,帮忙。metricid 都相同时怎么找到它对应的各个id 哪位高手能帮我解释一下这段c#视频头操作程序?在线等~~ 请问double,float转成int是舍尾还是收尾? 着急!VS 2005中如何获取配置文件的连接字符窜? 如何解决字段、属性、参数、变量中的可能存在的命名冲突问题? webbrowser播放视频问题 请教各位如何用线程来写代码? 奇怪的编译结果,请各位大虾帮小弟看看。不胜感激 请问如何删除 字符串组 其中的一组字符串 C/s,欢迎界面
[Id] [smallint] IDENTITY(1,1) NOT NULL,
[Layer] [varchar](1000) COLLATE Chinese_PRC_CI_AS NOT NULL,
[Name] [nvarchar](20) COLLATE Chinese_PRC_CI_AS NOT NULL,
CONSTRAINT [PK_DEF_ProductCategory] PRIMARY KEY CLUSTERED
(
[Id] ASC
)--WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]出来的格式是
id Layer Name
2 2, 名称1
3 3, 名称2
4 4, 名称3
5 2,5 名称5--该项是 名称1的子项
6 2,5,6 名称6--该项是 名称1的子项下 名称5的子项这样的设计好在能用模糊查询
当点击父类时能列出对应它下面的项,无论是多少层的
接点id 上一级接点id 接点名称
以树型结构显示时,通过递归即可.
2 2, 名称1
3 3, 名称2
4 4, 名称3
5 2,5 名称5--该项是 名称1的子项
6 2,5,6 名称6--该项是 名称1的子项下 名称5的子项 这样的设计好在能用模糊查询
当点击父类时能列出对应它下面的项,无论是多少层的
提交后移位了 重发
nodeID ------------节点标识parentNodeID ------------父节点标识,如果是根节点为空nodeName ------------节点名称groupID ------------树分组标识(这样可以在表中定义多棵树,而只需指定组号即可,根据组号找出无父节点的根节点,然后递归下去即可).....
parent_id
classname
.
.
.
id格式 *_*_*_*
*用数字或字母代替
第一级类用 *
第二级用*_*
这样只需要查询id长度即可知道是否有子类。一张表搞定
2 2, 名称1
3 3, 名称2
4 4, 名称3
5 2,5 名称5--该项是 名称1的子项
6 2,5,6 名称6--该项是 名称1的子项下 名称5的子项
这样写的话,那Tree控件怎么用代码show出来?
//下面步骤只是取出第一层的树节点
DataTable table = ListUtility.ConvertToDataTable(ServiceProvider.ProductCategoryService.Search()); for (int i = 0; i < table.Rows.Count; i++)
{
string[] ling = table.Rows[i]["Layer"].ToString().Split(',');
if (ling.Length == 2)
{
TreeNode tn = new TreeNode();
tn.Text = table.Rows[i]["name"].ToString();
tn.Tag = table.Rows[i]["Layer"];
tree.Nodes[0].Nodes.Add(tn);
table.Rows.RemoveAt(i);
i--;
}
}然后用boo控制循环(确保值读出后结束循环)bool boo = true;
while (boo)
{
for (int i = 0; i < table.Rows.Count; i++)
{
if (digui(tree.Nodes[0], table.Rows[i]))
{
table.Rows.RemoveAt(i);
i--;
}
if (table.Rows.Count == 0)
{
boo = false;
break;
}
}
if (table.Rows.Count == 0)
{
boo = false;
break;
}
}
tree.ExpandAll();主要的方法体 /// <summary>
/// 递归拿值
/// </summary>
private bool digui(TreeNode node, DataRow p)
{
TreeNode tn;
foreach (TreeNode no in node.Nodes)
{
string[] shuzu = no.Tag.ToString().Split(','); string[] shuzu2 = p["layer"].ToString().Split(','); if (shuzu[shuzu.Length - 2].ToString() == shuzu2[shuzu2.Length - 3].ToString())
{
tn = new TreeNode();
tn.Text = p["name"].ToString();
tn.Tag = p["Layer"].ToString();
no.Nodes.Add(tn);
return true;
}
else
{
if (digui(no, p))
{
return true;
}
}
}
return false;
}
还有用以上方法树默认要有一个跟节点