TreeView如何和数据库的操作(顶有分)

liuzuofei 2009-06-10 11:26:06
数据库有一个表:


create table T_AREA (
ID char(32) not null,
CODE varchar(50) null,
NAME varchar(50) null,
PARENT_CODE varchar(50) null,
USER_COUNT int null,
INFO varchar(200) null,
constraint PK_T_AREA primary key (ID)
)

这是一个区域表,其中父区域可以无限扩展子区域,即在表中每一个区域都存在一个父区域编码。

问题是:在treeview中如何快速实现数据的展示?并且每一条记录都能绑定在一个treenode.tag中?

求高手指点....
...全文
365 88 打赏 收藏 转发到动态 举报
写回复
用AI写文章
88 条回复
切换为时间正序
请发表友善的回复…
发表回复
caoweichao 2010-07-15
  • 打赏
  • 举报
回复
内容确实很丰富,学习了!
济南大飞哥 2010-03-11
  • 打赏
  • 举报
回复
google到,mark下!
only_lonely 2009-06-11
  • 打赏
  • 举报
回复
顶··
灵雨飘零 2009-06-11
  • 打赏
  • 举报
回复
up


boywangliang 2009-06-11
  • 打赏
  • 举报
回复
up
liuzuofei 2009-06-11
  • 打赏
  • 举报
回复
怎么回事那?就用你的代码,没啥区别的嘛!
lovvver 2009-06-11
  • 打赏
  • 举报
回复
楼主的心态如此浮躁,方法都是没有问题的,你了解了原理,然后只要跟踪一下,就可以解决问题了,什么问题都想拿到这里来问,又想一点脑筋都不动,反而浪费了时间,从昨天到今天,你随便针对一种方法花半个小时看一下,这个问题早就解决了,弄到今天还没搞定,听别人的,这里看看,那里看看,然后还是出错,就是不懂脑子。

真为你这样的程序员感到悲哀。。。
qqiuzaihui 2009-06-11
  • 打赏
  • 举报
回复
汗, 楼主你加下QQ:308251570, 我把我做的Table与实例发给你研究一下吧。
liuzuofei 2009-06-11
  • 打赏
  • 举报
回复
一直不停的在循环中执行,总共6条记录,调试中,循环了无数次,没耐心了,F5,就出了这个错!
liuzuofei 2009-06-11
  • 打赏
  • 举报
回复
改成了:string childExpress = string.Format("PARENT_ID='{0}'", dr["ID"].ToString());
还是报错:
未处理的“System.StackOverflowException”类型的异常出现在 mscorlib.dll 中。
在处理时:
if (this.myRegion.Select(childExpress).Length > 0)
angel6709 2009-06-11
  • 打赏
  • 举报
回复
拿分
qqiuzaihui 2009-06-11
  • 打赏
  • 举报
回复
晕, 后一个写错了:
 string childExpress = string.Format("PARENT_ID='{0}'", dr["ID"].ToString());

这里的 {0} 表示的是 dr["ID"].ToString() 值, 楼主写成 {"+pid+"}" , 把我与弄糊涂了。 呵呵。
qqiuzaihui 2009-06-11
  • 打赏
  • 举报
回复
你的pid数据类型为:varchar, 要改两个地方:

BuildTree("PARENT_ID="+pid, this.myRegion.Select("PARENT_ID=" + pid)[0], trvboot);
改成:
BuildTree("PARENT_ID='"+pid+"'", this.myRegion.Select("PARENT_ID='" + pid+"'")[0], trvboot);


 string childExpress = string.Format("PARENT_ID={"+pid+"}", dr["ID"].ToString());
改成:
 string childExpress = string.Format("PARENT_ID='"+pid+"'", dr["ID"].ToString());

这样就行了。
Joannaz_924 2009-06-11
  • 打赏
  • 举报
回复
liuzuofei 2009-06-11
  • 打赏
  • 举报
回复
我的代码:报错,string->int32


DataTable myRegion;
string pid = "00000000000000000000000000000000";

private void button1_Click(object sender, EventArgs e)
{
DataSet ds = GetAllArea();
myRegion = ds.Tables[0];

tv.Nodes.Clear(); //trvXML为你的Treeview控件名
TreeNode trvboot = new TreeNode("花园小区");

DataRow dr = myRegion.Rows.Add();
dr["CODE"] = "888";
dr["PARENT_ID"] = pid;
dr["ID"] = pid;
dr["USER_COUNT"] = -1;
trvboot.Tag = dr;
tv.Nodes.Add(trvboot);

BuildTree("PARENT_ID="+pid, this.myRegion.Select("PARENT_ID=" + pid)[0], trvboot);    //把SuperID改成你的父级ID,这里的0为最顶点ID值
tv.Nodes[0].Expand();

}

public DataSet GetAllArea()
{
StringBuilder strSql = new StringBuilder();
strSql.Append("select ID,CODE,NAME,PARENT_ID,USER_COUNT,INFO from T_AREA ");

DataSet ds = DBFacade.ExecuteDataSet(strSql.ToString());
return ds;
}

//使用递归创建 TreeView
private void BuildTree(string expression, DataRow drRow, TreeNode lstNode)
{
int superCount = this.myRegion.Select(expression).Length;
if (superCount > 0)
{
foreach (DataRow dr in this.myRegion.Select(expression))
{
string childExpress = string.Format("PARENT_ID={"+pid+"}", dr["ID"].ToString()); //把SuperID改成你的父级ID
if (this.myRegion.Select(childExpress).Length > 0)
{
TreeNode sublst = new TreeNode(dr["NAME"].ToString());
sublst.Tag = dr;
lstNode.Nodes.Add(sublst);
BuildTree(childExpress, dr, sublst);
}
else
{
BuildTree(childExpress, dr, lstNode);
}
}
}
else
{
TreeNode node = new TreeNode(drRow["NAME"].ToString());
node.Tag = drRow;
lstNode.Nodes.Add(node);
}
superb_aby 2009-06-11
  • 打赏
  • 举报
回复
en 正解
qqiuzaihui 2009-06-11
  • 打赏
  • 举报
回复
[Quote=引用 56 楼 liuzuofei 的回复:]
今天起个早,继续昨天的问题:
1.有一个方法中提到:
BuildTree("SuperID=0", this.myRegion.Select("SuperID=0")[0], trvboot);    //把SuperID改成你的父级ID,这里的0为最顶点ID值

这一段是什么意思?具体我的应用怎么改?PARENT_ID =????

[/Quote]

"这是一个区域表,其中父区域可以无限扩展子区域,即在表中每一个区域都存在一个父区域编码。 "
SuperID 就是你区域表中的父区域的ID值,我不知道你这个区域表的父区域是哪一个字段,所以用了SuperID代替了。

这样吧,我把我的中国城乡表结构给你看一个就明白了:
ChinaRegion](
[AreaID] [int] not NULL, --行政区序号
[SuperID] [int] NOT NULL, --上级行政区序号,其中0:无上级行政区(省份或直辖市)
[AreaName] [varchar](50) NULL, --行政区名称
[GbCode] [char](6) NULL, --6位国标行政区编码
[AreaClass] [char](1) NULL, --B:省/直辖市;C-市/行政区;D-县/城乡
)

那么这里, 每一个行政区均有序号,当SuperID为0时, 即表示其无上级行政区, 所以 0 必定为整个表数据的顶点了。
liuzuofei 2009-06-11
  • 打赏
  • 举报
回复

public class AreaHelper
{
public T_AREA ArrangeAreaNodes(List<T_AREA> areaNodes)
{
List<T_AREA> arrangedNodes = new List<T_AREA>();

foreach (T_AREA node in areaNodes)
{
node.Text = node.NAME;
node.Tag = node;
T_AREA parent = getNode(arrangedNodes, node.PARENT_ID);
if (parent != null)
{
parent.Nodes.Add(node);
}
else
{
List<T_AREA> children = getChildrenNode(arrangedNodes, node.ID);
foreach (T_AREA child in children)
{
arrangedNodes.Remove(child);
node.Nodes.Add(child);
}
arrangedNodes.Add(node);
}
}

if (arrangedNodes.Count == 0) return null;
return arrangedNodes[0] ;
}

private T_AREA getNode(List<T_AREA> areaNodes, string id)
{
foreach (T_AREA node in areaNodes)
{
if (node.ID == id)
{
return node;
}
}

return null;
}

private List<T_AREA> getChildrenNode(List<T_AREA> areaNodes, string id)
{
List<T_AREA> children = new List<T_AREA>();
foreach (T_AREA node in areaNodes)
{
if (node.PARENT_ID == id)
{
children.Add(node);
}
}

return children;
}

}



调用地方:

Area area = new Area();
//生成资源树
List<T_AREA> nodeList = area.GetAllModel(); // from db

AreaHelper helper = new AreaHelper();
this.area_tv.Nodes.Add(helper.ArrangeAreaNodes(nodeList));
this.area_tv.ExpandAll();

calen 2009-06-11
  • 打赏
  • 举报
回复
jf
evaa006 2009-06-11
  • 打赏
  • 举报
回复
UP
加载更多回复(66)

110,545

社区成员

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

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

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