熟悉数据结构的 进来看一下。

coolljx 2003-07-26 05:47:18
涉及到:DataTable,堆栈,

现在要求做一个 无限层级的 树型 组织结构图:

根部门
二级部门1
二级部门2
三级部门1
三级部门2
四级部门1
.
.
二级部门3
三级部门3
三级部门4

数据库表设计如下

部门编号(ID) 部门名称等(Name) 所属上级部门编号(MotherID) 组织层次
1 根部门 0 1
2 二级部门1 1 2
3 二级部门2 1 2
4 三级部门1 2 3

最后一个字段为冗余字段。
假设 已经将 此表读入到 DataTable1 中

现在要求 遍历此数据表 写出如上所示的组织结构图。请高手帮忙啊!
...全文
49 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
coolljx 2003-08-07
  • 打赏
  • 举报
回复
很强
xixigongzhu 2003-08-01
  • 打赏
  • 举报
回复
但要保证部门编号(ID)这一栏是连续的。
xixigongzhu 2003-07-31
  • 打赏
  • 举报
回复
用数据链的概念更好,速度更快。
只需讲AddData方法改一下即可:
private void AddData() {
ArrayList list = new ArrayList();
foreach(DataRow dr in this.table.Rows)
{
int pid = Convert.ToInt32(dr["MotherID"]);
Tree tn = new Tree();
tn.Name = dr["Name"].ToString();
tn.Id = Convert.ToInt32(dr["ID"]);
list.Add(tn);
if (root == null) {
root = tn;
} else {
((Tree) list[pid - 1]).AddChild(tn);
}
}
}
xixigongzhu 2003-07-31
  • 打赏
  • 举报
回复
用树来实现,速度比较慢:
using System;
using System.Collections;
using System.Data;
using System.Data.SqlClient;

public class Partment {
public static void Main() {
Partment p = new Partment("server=localhost;user id=sa;password=;database=master;");
Console.WriteLine(p.root.Id+":"+p.root.Name);
print(p.root, 0);
}
static void print(Tree t, int level) {
for (int i = 0; i < t.ChildCount(); i++) {
Tree ch = t.Child(i);
for (int j = 0; j < level + 1; j++) {
Console.Write(" ");
}
Console.WriteLine(ch.Id+":"+ch.Name);
if (ch.ChildCount() > 0) {
print(ch, level + 1);
}
}
}
Tree root;
DataTable table;
public Partment(String conn) {
Init(conn);
}

public void Init(String conn)
{
string sql = "select * from department order by ID, MotherID";
SqlDataAdapter sda = new SqlDataAdapter(sql, conn);
table = new DataTable("department");
try
{
sda.Fill(table);
}
catch(Exception err)
{
//±êÖ¾
return;
}
AddData();
}

private void AddData() {
int parent = 1;
Tree t = null;
foreach(DataRow dr in this.table.Rows)
{
int pid = Convert.ToInt32(dr["MotherID"]);
Tree tn = new Tree();
tn.Name = dr["Name"].ToString();
tn.Id = Convert.ToInt32(dr["ID"]);
if (root == null) {
root = tn;
t = root;
} else if (parent == pid) {
t.AddChild(tn);
} else {
parent = pid;
GetParent(t, pid).AddChild(tn);
}
}
}

private static Tree GetParent(Tree par, int parent) {
if (par.Id == parent) {
return par;
}
for (int i = 0; i < par.ChildCount(); i++) {
Tree t = par.Child(i);
if (parent == t.Id) {
return t;
}
}

for (int i = 0; i < par.ChildCount(); i++) {
Tree t = par.Child(i);
if (t.ChildCount() > 0) {
t = GetParent(t, parent);
if (t != null) {
return t;
}
}
}
return null;
}

public class Tree {
public String Name;
public int Id;
ArrayList child;
public Tree() {
}

public void AddChild(Tree ch) {
if (child == null) {
child = new ArrayList();
}
child.Add(ch);
}

public int ChildCount() {
return child == null ? 0 : child.Count;
}

public Tree Child(int index) {
return child == null ? null : (Tree) child[index];
}
}
}
coolljx 2003-07-31
  • 打赏
  • 举报
回复
我的是webform
hehaorome 2003-07-31
  • 打赏
  • 举报
回复
学习~~
coolljx 2003-07-31
  • 打赏
  • 举报
回复
为什么编译器说 TreeNode 没有定义a?
cl_03 2003-07-27
  • 打赏
  • 举报
回复
用SQL取出数据按组织层次排序,组织层次相同按所属上级部门排序,

用两个FOR循环嵌套

第一个循环插入每一层的结点
第二个循环插入该层的每个子结点。
cppTrier 2003-07-27
  • 打赏
  • 举报
回复
看数据结构应该是个广义表吧?
coolljx 2003-07-26
  • 打赏
  • 举报
回复
to 雪狼 :没有收到您的邮件 。

to NorthSky :您的方法很好。特别是递归,给我很大启发,我一直想用 堆栈 ,所以一直没有成功。
ju_feng 2003-07-26
  • 打赏
  • 举报
回复
简单的递归过程,假设最上级的部门编码为0
部门编号(ID) 部门名称等(Name) 所属上级部门编号(MotherID)字段分别为
departmentID,departMentName ,parentID

private DataTable createDepartMent()
{
string sql = "select * from department";
SqlDataAdapter sda = new SqlDataAdapter(sql,conn);
DataTable dt = new DataTable("department");
dt.Clear();
try
{
sda.Fill(dt);
return dt;
}
catch(Exception err)
{
return null;
}

}

private void Form1_Load(object sender, System.EventArgs e)
{
this.dtDept = this.createDepartMent();
if(dtDept == null)
{
MessageBox.Show("Read Data Error");
return;
}
this.addTreeNode();
}

private void addTreeNode()
{
foreach(DataRow dr in this.dtDept.Rows)
{

if(dr["parentId"].ToString()=="0")
{
TreeNode tn = new TreeNode();
tn.Text=dr["departmentName"].ToString();
string strTag = dr["departmentID"].ToString();
tn.Tag=dr["departmentID"].ToString();
this.TreeDpt.Nodes.Add(tn);
this.addNodes(tn);

}
}
}
private void addNodes(TreeNode parentn)
{
foreach(DataRow dr in this.dtDept.Rows)
{
string parentid = dr["parentId"].ToString();
string strID = parentn.Tag.ToString();
if(parentid==strID)
{
TreeNode tn = new TreeNode();
tn.Text=dr["departmentName"].ToString();
tn.Tag=dr["departmentID"].ToString();
parentn.Nodes.Add(tn);
this.addNodes(tn);
}
}

}
雪狼1234567 2003-07-26
  • 打赏
  • 举报
回复
我已经给你发啦,看有没有收到
jiezhi 2003-07-26
  • 打赏
  • 举报
回复
不知是什么數據庫,
如果是oracle和db2:一條sql就可以出來,如果是sql server則可以寫存儲過程。
MarcuseXiao 2003-07-26
  • 打赏
  • 举报
回复
雪狼:

好给我个例子吧! marguess3@263.net
coolljx 2003-07-26
  • 打赏
  • 举报
回复
有没有好的意见啊,我正在等啊!
coolljx 2003-07-26
  • 打赏
  • 举报
回复
不行啊,邮件被退会 ,还是你给我发吧,我的 Mail:QuitGame@qgzxol.com,ljx82@21cn.com
coolljx 2003-07-26
  • 打赏
  • 举报
回复
我已经给你发了Mail 了,谢谢。
雪狼1234567 2003-07-26
  • 打赏
  • 举报
回复
给个Email给你一个例子,我mailwolfwife1@163.com

110,537

社区成员

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

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

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