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控件,但是要实现图像版块显示,只能找一个符合你审美观和需求的第三方控件了,或者自己自定义控件。无论你使用什么类型的控件,数据部分都是这样的,怎么改都是大同小异。
使用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);
如果只是实现结构
用treeview就可以
{
node.Value = 当前编号;
List<string> 子级编号 = 查询数据库("select 编号 from yourTable where 父级编号='" + 当前编号 + "'");
foreach(string x in 子级编号)
{
TreeNode n = new TreeNode();
node.Nodes.Add(n);
完善节点(n, x);
}
} 这就是一个简单的“递归”算法。每当为node的子树集合添加一个新的节点n的时候,递归调用“自己”这个方法,从而完善了节点也就同时完善了子树。
2:遍历A,创建父 TreeNode, 根据 编号匹配 父级编号 下的子数据;放到List B中
3:遍历 B 创建子TreeNode,添加到父TreeNode下。
例子的话, 随便搜了一篇,没细看
http://blog.csdn.net/wangpeng047/article/details/68779172. UI体现的, 2#的自己画,或者其它楼的C#的Tree表现,看你的需求了
晕死,又改成问如何画图了。如果问画图问题,你贴出关系数据库干嘛啊?你应该直接问 TreeNode(或者 TreeView)控件如何添加到窗口上显示的问题。或者还有别的什么控件可以显示那个图形的问题。或者自己如何开发自定义控件的问题。我们的与这个一样,功能强200倍的控件是自己开发的。所以跟你说了也白搭,你也不能看懂。你自己搜一个开源的数控件吧。不要把一堆无关的数据库表贴上来。不要让别人给你写所有代码。
2. 生成一个Panel
3. 根据树结构的层次,节点数,算出Panel的宽高
4. 遍历树结构,开画
(1) 从Panel. CreateGraphics 出一个绘图实例来
(2) 根据当前节点该在的位置, DrawRectangle, FillRectangle, DrawText, DrawLine之类的
没有现成的控件可以实现这个图,估计你只想确认这句话而已
treeview实现的是左侧的,我现在要网络图的形式,你知道怎么画吗?
现在是有这样的数据表,问题是想实现那个组织结构图,不知道要怎么来画出来,您有这方面的资料吗?
有能力做这个的,也没有几个像sp大神一样有闲工夫跑这教学生来
你的数据库中的数据,只是原始数据
你要先组织成 树结构的数据 (方便处理)------ 方法的话,楼上各楼都给出了
然后你用这个方便处理的数据(树结构),再去画图 --- 最简单的方法就是想象着你手动画这个图怎么画的,程序就怎么写(循环,递归随意)
数据库数据 ---> 【整理】 ---> 树状结构数据 -----> 【遍历】 ---> 画图
from member
start with 父级编号 in(101002) --李四
connect by prior 编号=父级编号;
这样就可以递归查询到所有李四那个分支(包括李四)的数据。在程序代码中,通过:DataTable dtAll=上面查询的结果;DataRow[] drrArr = dtAll.Select("父级编号='李四'");
foreach (DataRow dr in drrArr)
{
这里的dr将得到李四分支下的左右两个结点的数据
}
上面使用递归查询,一次性查询了整棵树的数据。也可以每次展开结点后再查询。这是数据逻辑层的内容。界面显示部分(UI),现成的可以使用各种tree控件,但是要实现图像版块显示,只能找一个符合你审美观和需求的第三方控件了,或者自己自定义控件。无论你使用什么类型的控件,数据部分都是这样的,怎么改都是大同小异。
//加载根节点开始递归调用填充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;
}