用DataTable动态加载目录树

ws_hgo 2009-01-16 09:27:28
表结构如下
ID Title ParentID ChildNum Depth OrderNo
1 产品分类 0 10 0
62 动力设别 1 15 1
63 气压,液压,电气 1 3 1
65 动力设别1 62 2
66 动力设别2 62 2
67 动力设别3 62 2
68 其它 62 2
69 气压1 63 2
70 起重机及配件 1 1

在页面的表现形式是:
1 ⊙分类名称 0
2 ├动力设别 1
42│ ┌动力设别1 9
43│ ├动力设别2 10
44│ ├动力设别2 11
51│ └其他 18
14├气压,液压,电气 5
15│ ├气压1 10
15└起重机及配件

一定要用DataTable
...全文
323 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
wyp19870608 2011-08-25
  • 打赏
  • 举报
回复
学习了
ws_hgo 2009-01-21
  • 打赏
  • 举报
回复
被我像复杂啦!
  
static DataColumn column = new DataColumn();
static DataTable table = new DataTable();

static DataRow MyRow;
public static DataTable GetCategoryTree(WebInfoBase info)
{

DataTable dt = info.List(_DefaultDB, "", "[ID],[Title],[ParentID],[ChildNum],[Depth],[OrderNo]", "&version=", "[ID] ASC");
if (table.Rows.Count > 0)
{
table.Columns.Clear();
table.Rows.Clear();
}
CreateDataTable();
GetTree(dt, "0", 0);
return table;
}
public static void GetTree(DataTable dt, string pid, int blank)
{
string str = " ";
DataView dv = new DataView(dt);
dv.RowFilter = "ParentID = " + pid;
if (blank > 0)
{
string s = "";
if (blank == 1)
{
str = "├";
}
for (int i = 2; i <= blank; i++)
{
s = s + " | "+" "+" - ";
}
str = s + "├";
}

foreach (DataRowView drv in dv)
{
string id = drv["ID"].ToString();
string Title = drv["Title"].ToString();
string OrderNo = drv["OrderNo"].ToString();
string ParentID = drv["ParentID"].ToString();
string Depth = drv["Depth"].ToString();
string ChildNum = drv["ChildNum"].ToString();

MyRow = table.NewRow();
MyRow["ID"] = int.Parse(id);
MyRow["Title"] = str + Title;
MyRow["OrderNo"] = int.Parse(OrderNo);
MyRow["ParentID"] = int.Parse(ParentID);
MyRow["Depth"] = int.Parse(Depth);
MyRow["ChildNum"] = int.Parse(ChildNum);
table.Rows.Add(MyRow);

int n = int.Parse(Depth);
//if (n <= 1)
//{
n++;
//}
GetTree(dt, id, n);
}
}
public static void CreateDataTable()
{
table.Columns.Clear();
column = new DataColumn();
column.DataType = System.Type.GetType("System.Int32");
column.ColumnName = "ID";
table.Columns.Add(column);

column = new DataColumn();
column.DataType = System.Type.GetType("System.Int32");
column.ColumnName = "ParentID";
table.Columns.Add(column);

column = new DataColumn();
column.DataType = Type.GetType("System.String");
column.ColumnName = "Title";
table.Columns.Add(column);

column = new DataColumn();
column.DataType = Type.GetType("System.Int32");
column.ColumnName = "ChildNum";
table.Columns.Add(column);

column = new DataColumn();
column.DataType = Type.GetType("System.Int32");
column.ColumnName = "Depth";
table.Columns.Add(column);

column = new DataColumn();
column.DataType = Type.GetType("System.Int32");
column.ColumnName = "OrderNo";
table.Columns.Add(column);
//table.Columns.Clear();

}
ws_hgo 2009-01-17
  • 打赏
  • 举报
回复
cool 兄
我这样显示之后
目录树
中信息是可以修改,删除的
ws_hgo 2009-01-17
  • 打赏
  • 举报
回复
cool兄
谢啦
我先看看
大家看下有没有更好的代码!
田猿笔记 2009-01-17
  • 打赏
  • 举报
回复
dataable是一个表结构,你的要求是一个树型结构,用datatable做不可取.
如果你一定要这样做的话:
你首先生成一个xml,xml可以表达你的树型结构..
然后用dataset读这个xml,再重dataset中取出datatable,就可以了..
燥动的心 2009-01-17
  • 打赏
  • 举报
回复
看错了,为什么不用treeview.
sprc_lcl 2009-01-17
  • 打赏
  • 举报
回复
     /// <summary>
/// 把一个无限循环数据表绑定,并分层显示
/// </summary>
/// <param name="dt">需要的dt</param>
/// <param name="firstfather_id">第一项的父ID值</param>
/// <param name="childid">子ID字段名</param>
/// <param name="father_id">父ID字段名</param>
/// <param name="name">显示字段名</param>
/// <param name="needlayer">显示的层数,为负值则不限</param>
/// <param name="firstnull">为定值""</param>
public static void GetTreeHtml(ref string htmlstr, DataTable dt, string firstfather_id, string childid, string father_id, string name, int needlayer, string firstnull)
{
if (needlayer > 0 || needlayer < 0)
{
DataRow[] drs = dt.Select(father_id + "=" + firstfather_id);
for (int i = 0; i < drs.Length; i++)
{
htmlstr += firstnull + drs[i][name].ToString() + "<br>";//dv[i][childid].ToString()
string firstnull1 = "";
if (firstnull.IndexOf("|-") >= 0)
{
firstnull1 = "| " + firstnull;
}
else
{
firstnull1 = " |-";
}
GetTreeHtml(ref htmlstr, dt, drs[i][childid].ToString(), childid, father_id, name, needlayer - 1, firstnull1);
}
}
}


//改动了一下,上一个效率太低
sprc_lcl 2009-01-17
  • 打赏
  • 举报
回复
        DataTable dt= ...;
string htmlstr = "";
GetTreeHtml(ref htmlstr,dt,"0","AT_Id","AT_ParentId","AT_Name",-1,"|-");
Response.Write(htmlstr);
}

/// <summary>
/// 把一个无限循环数据表绑定,并分层显示
/// </summary>
/// <param name="dt">需要的dt</param>
/// <param name="firstfather_id">第一项的父ID值</param>
/// <param name="childid">子ID字段名</param>
/// <param name="father_id">父ID字段名</param>
/// <param name="name">显示字段名</param>
/// <param name="needlayer">显示的层数,为负值则不限</param>
/// <param name="firstnull">为定值""</param>
public static void GetTreeHtml(ref string htmlstr, DataTable dt, string firstfather_id, string childid, string father_id, string name, int needlayer, string firstnull)
{
if (needlayer > 0 || needlayer < 0)
{
DataView dv = dt.DefaultView.ToTable().DefaultView;
dv.RowFilter = father_id + "=" + firstfather_id;
for (int i = 0; i < dv.Count; i++)
{
htmlstr += firstnull + dv[i][name].ToString()+"<br>";//dv[i][childid].ToString()
string firstnull1 = "";
if (firstnull.IndexOf("|-") >= 0)
{
firstnull1 = "| " + firstnull;
}
else
{
firstnull1 = " |-";
}
GetTreeHtml(ref htmlstr, dt, dv[i][childid].ToString(), childid, father_id, name, needlayer - 1, firstnull1);
}
dv.Dispose();
}
}
燥动的心 2009-01-17
  • 打赏
  • 举报
回复
差不多就这样吧。
应该修改一下就能用了。
燥动的心 2009-01-17
  • 打赏
  • 举报
回复
//邦定根节点
public void BindTreeView(string TargetFrame, DataTable dt)
{
DataRow[] drs = dt.Select("ParentID= " + 0);// 选出所有子节点
//菜单状态



TreeView1.Nodes.Clear(); // 清空树

foreach (DataRow r in drs)
{
string nodeid = r["ID"].ToString();
string text = r["Text"].ToString();
string parentid = r["ParentID"].ToString();
string location = r["Location"].ToString();
string url = r["Url"].ToString();
string imageurl = r["ImageUrl"].ToString();
int roleTaskID = int.Parse(r["RoleTaskID"].ToString().Trim());
string framename = TargetFrame;

//treeview set
this.TreeView1.Font.Name = "宋体";
this.TreeView1.Font.Size = FontUnit.Parse("9");

//权限控制菜单

TreeNode rootnode = new TreeNode();
rootnode.Text = text;
rootnode.Value = nodeid;
rootnode.NavigateUrl = url;
rootnode.Target = framename;
rootnode.Expanded = menuExpand;
rootnode.ImageUrl = imageurl;




int sonparentid = int.Parse(nodeid);// or =location
CreateNode(framename, sonparentid, rootnode, dt);

TreeView1.Nodes.Add(rootnode);

}
}

//邦定任意节点
public void CreateNode(string TargetFrame, int parentid, TreeNode parentnode, DataTable dt)
{
DataRow[] drs = dt.Select("ParentID= " + parentid);//选出所有子节点
foreach (DataRow r in drs)
{
string nodeid = r["ID"].ToString();
string text = r["Text"].ToString();
string location = r["Location"].ToString();
string url = r["Url"].ToString();
string imageurl = r["ImageUrl"].ToString();
int roleTaskID = int.Parse(r["RoleTaskID"].ToString().Trim());
string framename = TargetFrame;

//权限控制菜单

TreeNode node = new TreeNode();
node.Text = text;
node.Value = nodeid;
node.NavigateUrl = url;
node.Target = TargetFrame;
node.ImageUrl = imageurl;
node.SelectAction = TreeNodeSelectAction.Expand;
int sonparentid = int.Parse(nodeid);

if (parentnode == null)
{
TreeView1.Nodes.Clear();
parentnode = new TreeNode();
TreeView1.Nodes.Add(parentnode);
}

CreateNode(framename, sonparentid, node, dt);

parentnode.ChildNodes.Add(node);

}
}
ws_hgo 2009-01-17
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 ws_hgo 的回复:]

[/Quote]
ss
一品梅 2009-01-17
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 ws_hgo 的回复:]
cool兄
谢啦
我先看看
大家看下有没有更好的代码!
[/Quote]
基本上就是这样的代码...
ws_hgo 2009-01-17
  • 打赏
  • 举报
回复
一品梅 2009-01-16
  • 打赏
  • 举报
回复
又发了一帖?
daidaiboy 2009-01-16
  • 打赏
  • 举报
回复
在sql语句中用with语句产生你要的表,然后再加载到datatable看看行不行,sql server 2005的帮助中有专门的关于with查询这种情况的实例,可以参考下q,我要回家了,就不给你写了,呵呵,自己找找看,不知道能不能帮上忙。
wzy_love_sly 2009-01-16
  • 打赏
  • 举报
回复
ws_hgo 2009-01-16
  • 打赏
  • 举报
回复
一下子
就石沉大海了
ws_hgo 2009-01-16
  • 打赏
  • 举报
回复
ws_hgo 2009-01-16
  • 打赏
  • 举报
回复
老大貌似不在啊
ws_hgo 2009-01-16
  • 打赏
  • 举报
回复
我相信
高手一定会帮我解决的
加载更多回复(17)

62,269

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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