SQL中的数据 与 树 的问题,求高人指点?谢谢!

junoveia 2014-09-19 09:10:11
表: member

编号 姓名 父级编号 位置 性别 年龄
101001 张三 男 22
101002 李四 101001 左 女 33
101003 王五 101001 右 男 55
101004 赵六 101002 左 女 66
101005 张那 101002 右 男 12
101006 李玉青 101003 左 女 23
101007 赵几凡 101005 左 男 25

这个表里的数据 在asp.net 中用 C# 如何实现二叉树的结构,具体是什么来做,最好有源码,我是新手,在此我先谢谢各位高人指点?希望高人不吝赐教!!!
...全文
465 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
番茄并不番 2016-07-05
  • 打赏
  • 举报
回复
111111111111111111111111111111111111111111
wuhg_2286783337 2014-09-20
  • 打赏
  • 举报
回复
使用TreeView控件实现树形系统导航 //加载根节点开始递归调用填充TreeView树形控件 protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { //获取数据连接语句,并创建数据库连接对象 myConn = DBClass.GetConnection(); CreateDataSet(); InitTree(TreeView1.Nodes, "0"); } } //选择数据库数据建立数据集对象返回数据 public DataSet CreateDataSet() { query = "select * from tbTree"; myAdapter = new SqlDataAdapter(query, myConn); data = new DataSet(); myAdapter.Fill(data, "tree"); return data; } //从DataSet中取数据建树 //从根节点开始递归调用显示子树 public void InitTree(TreeNodeCollection Nds, string parentId) { TreeNode NewNode; //data为存储建树数据信息的数据集 //用父节点进行筛选数据集中信息 DataRow[] rows = data.Tables[0].Select("parent_Id='" + parentId + "'"); foreach (DataRow row in rows) { NewNode = new TreeNode(row["title"].ToString(), //设置父节点 row["Files_Id"].ToString(), "images/1.gif", row["NavigateUrl"].ToString(), ""); Nds.Add(NewNode); InitTree(NewNode.ChildNodes, row["Files_Id"].ToString());//添加子节点 }//CodeGo.net/ } //点击节点跳转到指定页面 protected void TreeView1_SelectedNodeChanged1(object sender, EventArgs e) { int nodeId = Convert.ToInt32(TreeView1.SelectedValue);//获取TreeView控件选择的值 string url = DBClass.GetUrl(nodeId);//获取指定地址 Response.Redirect(url.ToString());//转到指定页 } //从数据库中获取控件中某个节点的关联地址 public static string GetUrl(int filesId) { //获得url地址 SqlConnection myConnection = GetConnection(); SqlCommand myCommand = new SqlCommand("GetUrl", myConnection); myCommand.CommandType = CommandType.StoredProcedure; //添加参数 SqlParameter FilsesId = new SqlParameter("@FilesId", SqlDbType.Int, 4); FilsesId.Value = filesId; myCommand.Parameters.Add(FilsesId); //添加参数 SqlParameter Url = new SqlParameter("@Url", SqlDbType.NVarChar, 100); Url.Direction = ParameterDirection.Output; myCommand.Parameters.Add(Url); //执行存储过程 myConnection.Open(); myCommand.ExecuteNonQuery(); string url = Url.Value.ToString(); myCommand.Dispose(); myConnection.Dispose(); return url; }
我叫小菜菜 2014-09-19
  • 打赏
  • 举报
回复
引用 1 楼 junoveia 的回复:
这是像这个图上的一样,如何实现啊?
select distinct *
from member 
start with 父级编号 in(101002)  --李四
connect by prior 编号=父级编号;
这样就可以递归查询到所有李四那个分支(包括李四)的数据。 在程序代码中,通过:

DataTable dtAll=上面查询的结果;

DataRow[] drrArr = dtAll.Select("父级编号='李四'");   
foreach (DataRow dr in drrArr)
{
  这里的dr将得到李四分支下的左右两个结点的数据
}
上面使用递归查询,一次性查询了整棵树的数据。也可以每次展开结点后再查询。 这是数据逻辑层的内容。 界面显示部分(UI),现成的可以使用各种tree控件,但是要实现图像版块显示,只能找一个符合你审美观和需求的第三方控件了,或者自己自定义控件。 无论你使用什么类型的控件,数据部分都是这样的,怎么改都是大同小异。
wanghui0380 2014-09-19
  • 打赏
  • 举报
回复
额,这东西现成滴控件一堆,addflow,flowchart,ilog dairgm。如果是web滴更多,我就不提了 如果是非要自己做,暂时就先别考虑绘图,暂时先考虑把数据转换成grahpml或者vml,然后在考虑开发一个显示granphml滴带交互滴通用控件
truediego 2014-09-19
  • 打赏
  • 举报
回复
我觉得你迷失在 data - view之间了 你的数据库中的数据,只是原始数据 你要先组织成 树结构的数据 (方便处理)------ 方法的话,楼上各楼都给出了 然后你用这个方便处理的数据(树结构),再去画图 --- 最简单的方法就是想象着你手动画这个图怎么画的,程序就怎么写(循环,递归随意) 数据库数据 ---> 【整理】 ---> 树状结构数据 -----> 【遍历】 ---> 画图
liuxiuming 2014-09-19
  • 打赏
  • 举报
回复
桉闰给的数据源的逻辑不对。。。
junoveia 2014-09-19
  • 打赏
  • 举报
回复
引用 15 楼 sp1234 的回复:
随便给你搜了一个,其它的你自己搜索一下:http://www.haolizi.net/example/view_734.html 这类控件开发(假设要求达到商用的稳定程度和功能要求的话)超过了csdn上99.9%的人员的能力,所以找现成的开源控件比较好。 但是你到底是读取树形数据结构有问题?还是不会使用某种控件?你应该真正问出具体问题。不要人家告诉了这个答案,你又说人家没搞懂的你的问题,你问的是另一个。
大神您好:可能是我表达的不清楚,我的目的是想 通过C# 来实现像二叉树一样 只有左和右两个子节点的树,然后用图型的形式显示出来,那个表是给的数据源。我不知道要怎么做,从何做起。很迷茫。。。
於黾 2014-09-19
  • 打赏
  • 举报
回复
sp大神说的很对,CSDN里99.9%的人都做不了 有能力做这个的,也没有几个像sp大神一样有闲工夫跑这教学生来
於黾 2014-09-19
  • 打赏
  • 举报
回复
所以我说,想完全实现你的图,需要自己画啊 如果你完全不会画,还是老老实实用vs自带的控件,或找个第三方控件吧 这些东西都是说说简单,做起来难如登天
junoveia 2014-09-19
  • 打赏
  • 举报
回复
引用 2 楼 Z65443344 的回复:
完全实现你画的这个图,你只能自己画 如果只是实现结构 用treeview就可以
treeview实现的是左侧的,我现在要网络图的形式,你知道怎么画吗?
引用 14 楼 truediego 的回复:
1. 先生成那个树结构 2. 生成一个Panel 3. 根据树结构的层次,节点数,算出Panel的宽高 4. 遍历树结构,开画 (1) 从Panel. CreateGraphics 出一个绘图实例来 (2) 根据当前节点该在的位置, DrawRectangle, FillRectangle, DrawText, DrawLine之类的 没有现成的控件可以实现这个图,估计你只想确认这句话而已
现在是有这样的数据表,问题是想实现那个组织结构图,不知道要怎么来画出来,您有这方面的资料吗?
  • 打赏
  • 举报
回复
随便给你搜了一个,其它的你自己搜索一下:http://www.haolizi.net/example/view_734.html 这类控件开发(假设要求达到商用的稳定程度和功能要求的话)超过了csdn上99.9%的人员的能力,所以找现成的开源控件比较好。 但是你到底是读取树形数据结构有问题?还是不会使用某种控件?你应该真正问出具体问题。不要人家告诉了这个答案,你又说人家没搞懂的你的问题,你问的是另一个。
truediego 2014-09-19
  • 打赏
  • 举报
回复
1. 先生成那个树结构 2. 生成一个Panel 3. 根据树结构的层次,节点数,算出Panel的宽高 4. 遍历树结构,开画 (1) 从Panel. CreateGraphics 出一个绘图实例来 (2) 根据当前节点该在的位置, DrawRectangle, FillRectangle, DrawText, DrawLine之类的 没有现成的控件可以实现这个图,估计你只想确认这句话而已
  • 打赏
  • 举报
回复
引用 9 楼 junoveia 的回复:
主要是那个图是怎么画出来的,图有了在用递归。哪位知道那个图要如何画?
晕死,又改成问如何画图了。 如果问画图问题,你贴出关系数据库干嘛啊?你应该直接问 TreeNode(或者 TreeView)控件如何添加到窗口上显示的问题。或者还有别的什么控件可以显示那个图形的问题。或者自己如何开发自定义控件的问题。 我们的与这个一样,功能强200倍的控件是自己开发的。所以跟你说了也白搭,你也不能看懂。你自己搜一个开源的数控件吧。 不要把一堆无关的数据库表贴上来。不要让别人给你写所有代码。
卧_槽 2014-09-19
  • 打赏
  • 举报
回复
引用 6 楼 sp1234 的回复:
如果你觉得没有递归编程的概念,建议你找一个软件专业课程去学习。有没有学会“递归”,这其实就跟“文盲与高中生”的区别样,在工作生活中混不了多久、早晚会明显地表现出来。
如果表数据稍微多点,就会递不动的。
junoveia 2014-09-19
  • 打赏
  • 举报
回复
引用 7 楼 porenasckx 的回复:
这个就是一个递归的思想,你先查询顶级节点,然后在顶级节点中拿编号带入数据库查询它的子节点,递归循环即可!
大哥,下面那个图怎么画呀?
junoveia 2014-09-19
  • 打赏
  • 举报
回复
引用 4 楼 sp1234 的回复:
上学时如果认真学过“递归”概念就好办了。 大致是
public void 完善节点(TreeNode node, string 当前编号)
{
    node.Value = 当前编号;
    List<string> 子级编号 = 查询数据库("select 编号 from yourTable where 父级编号='" + 当前编号 + "'");
    foreach(string x in 子级编号)
    {
        TreeNode n = new TreeNode();
        node.Nodes.Add(n);
        完善节点(n, x);
    }
} 
这就是一个简单的“递归”算法。每当为node的子树集合添加一个新的节点n的时候,递归调用“自己”这个方法,从而完善了节点也就同时完善了子树。
您知道那个图要怎么画出来吗?请您指点一下?谢谢!
junoveia 2014-09-19
  • 打赏
  • 举报
回复
主要是那个图是怎么画出来的,图有了在用递归。哪位知道那个图要如何画?
truediego 2014-09-19
  • 打赏
  • 举报
回复
1. 检索的话,如果是Oracle数据库,可以直接检测出树结构的结果 例子的话, 随便搜了一篇,没细看 http://blog.csdn.net/wangpeng047/article/details/6877917 2. UI体现的, 2#的自己画,或者其它楼的C#的Tree表现,看你的需求了
E次奥 2014-09-19
  • 打赏
  • 举报
回复
这个就是一个递归的思想,你先查询顶级节点,然后在顶级节点中拿编号带入数据库查询它的子节点,递归循环即可!
  • 打赏
  • 举报
回复
如果你觉得没有递归编程的概念,建议你找一个软件专业课程去学习。有没有学会“递归”,这其实就跟“文盲与高中生”的区别样,在工作生活中混不了多久、早晚会明显地表现出来。
加载更多回复(6)
呜呜呜.刚才上传了一下.好像出错了.重传一下.如果看到原来的检查一下哦.我等了两个小时都没见发布的那个版本.再不成功...偶就不管了..辛苦写的..郁闷. 更新历史3.0: 初始化数据完成后.发布成功后.就可以登陆了.用户名为:admin,密码:123456 每新增一个用户有一个默认的初始化密码.设置方法是在类 /Struts2Test3.0/src/com/wuxinfengjing/comm/GlobalConstants.java的DEFAULT_USER_PASSWORD变量上. 环境:jdk1.5 tomcat5.5.数据库用oracle.如果不用oracle的话.可能菜单表的查询出不来.我的菜单表的查询允许选择上级菜单查询该菜单所对应的所有下级菜单.所以用了递归查询. criteria.add(Restrictions.sqlRestriction("MENUITEM_ID in(select a.MENUITEM_ID from Wuxin_MENUITEM a connect by prior a.MENUITEM_ID = a.PARENT_ID"+ " start with a.MENUITEM_ID = '"+parentId+"')" )); mysqlsqlserver不知道有没有start with这个sql. jar包:项目除了使用了struts2,hibernate3.0和spring1.8以外(用spring2.0的包也可以.不能低于1.8的包.)还是用了junit,ajax,第三方的table组件.等等.所以需要下载相对应的包. 为了上传jar.我专门申请了一个网盘.所有下载地址在下载下来的这个rar包里面都有详细的介绍和说明. 说一下这个rar里面带的东西.除了源码外带了几篇文档.分别是关于项目所使用的dwr的配置.table组件的配置说明文档.junit单元测试说明文档.还有我写这个例子时应该注意的一些东西.外加一些关于struts2和hibernate的技巧心得整理. 说一下这次3.0更新的内容.可能大家在我的博客里面已经看到了相关的日志.我懒.下面就把那个日志抽出来当说明了啊.有兴趣的就下载下来瞅瞅.偶也是菜鸟的.写的不好不要骂街啊..在此感谢各位网友的期待和支持. 这几天我终于闲下来了.也有时间开始写struts2的第三个框架版本了.主要是针对写了第二个版本之后的一些问题做一些回答才做得第三个版本.间加一些小技巧之类的.不过我觉得还是值得一些关注的朋友期待的. 如果没有意外.这个版本应该是一个定型的版本了.在这段期间.有很多朋友问的问题大部分其实都已经不是struts2的范围了.有些都是hibernate和spring的.介于前两个版本都是单表.对hibernate的引用还是比较少的.这次索性写个多对多关系好了.打算写个权限系统好了.我就使用权限5张表.用户表,权限表.角色表.用户角色表和角色菜单表.(麻雀虽小...五脏俱全了啊...)当然这个写起来就费劲一些了.... 为了能够更好的使用各方面的技术.所以这次打算弄个大锅(弄个大锅也很累的.不过大家可能到时候配这个框架也就比较麻烦点了...不过我觉得还是能多学一下总是好的.) 说一下大锅的内容吧.自己写了个分页组件.(不是太好看...).现在ajax都已经不是什么新鲜东东了..我在里面配的是dwr..(这个简单些..其他的我看着晕...).没有自己写页面输出.我使用的table组件是:eXtremeComponents.自我感觉这个组件比较好.所以把这个组件配入进来了.随着这篇文章的发布.我会陆续在博客更新相关针对与当前项目模块的关于struts2的一些知识点.当作大家一起进步了... 也希望各位高人多多指点啊... 这个版本起名为Struts2Test3.0.以后的日志相关内容就为关于Struts2Test3.0例子的相关内容.

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧