高难度的treeview问题 数据库中有表:ID PID1 02 03 14 25 2PID是ID的父目录,PID=0表示该目录最高级,如何生成目录树:-1 |-3-2 |-4 |-5?? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 简单的TreeView绑定而已,例子:private void Page_Load(object sender, System.EventArgs e){ // 在此处放置用户代码以初始化页面 if(!Page.IsPostBack) { DataTable dt = new DataTable(); dt.Columns.Add("f_i_autoid"); dt.Columns.Add("f_NodeId"); dt.Columns.Add("f_ParentNodeId"); dt.Columns.Add("f_Name"); dt.Rows.Add(new object[]{1,1,0,"AAA"}); dt.Rows.Add(new object[]{2,2,0,"BBB"}); dt.Rows.Add(new object[]{3,3,0,"CCC"}); dt.Rows.Add(new object[]{4,4,1,"DDD"}); dt.Rows.Add(new object[]{6,6,2,"EEE"}); dt.Rows.Add(new object[]{7,7,3,"FFF"}); dt.Rows.Add(new object[]{8,8,6,"GGG"}); dt.Rows.Add(new object[]{9,9,7,"HHH"}); this.DataList1.DataSource = dt; this.DataList1.DataBind(); }}/// <summary>/// 用递归方法将数据中查询的数据添加TreeView控件的节点/// </summary>private void BindTreeNode(TreeNodeCollection notes,DataTable dataTB,string parentID){ DataRow[] rows = dataTB.Select("[f_ParentNodeId]='" + parentID + "'"); foreach(DataRow row in rows) { TreeNode newNode = new TreeNode(); newNode.ID = row["f_NodeId"].ToString(); newNode.Text = row["f_Name"].ToString(); notes.Add(newNode); this.BindTreeNode(newNode.Nodes,dataTB,newNode.ID); }} 贴错了,更正:private void Page_Load(object sender, System.EventArgs e){ // 在此处放置用户代码以初始化页面 if(!Page.IsPostBack) { DataTable dt = new DataTable(); dt.Columns.Add("f_i_autoid"); dt.Columns.Add("f_NodeId"); dt.Columns.Add("f_ParentNodeId"); dt.Columns.Add("f_Name"); dt.Rows.Add(new object[]{1,1,0,"AAA"}); dt.Rows.Add(new object[]{2,2,0,"BBB"}); dt.Rows.Add(new object[]{3,3,0,"CCC"}); dt.Rows.Add(new object[]{4,4,1,"DDD"}); dt.Rows.Add(new object[]{6,6,2,"EEE"}); dt.Rows.Add(new object[]{7,7,3,"FFF"}); dt.Rows.Add(new object[]{8,8,6,"GGG"}); dt.Rows.Add(new object[]{9,9,7,"HHH"}); this.BindTreeNode(this.TreeView1.Nodes,dt,"0"); }}/// <summary>/// 用递归方法将数据中查询的数据添加TreeView控件的节点/// </summary>private void BindTreeNode(TreeNodeCollection notes,DataTable dataTB,string parentID){ DataRow[] rows = dataTB.Select("[f_ParentNodeId]='" + parentID + "'"); foreach(DataRow row in rows) { TreeNode newNode = new TreeNode(); newNode.ID = row["f_NodeId"].ToString(); newNode.Text = row["f_Name"].ToString(); notes.Add(newNode); this.BindTreeNode(newNode.Nodes,dataTB,newNode.ID); }} 是这样吗? private void BindTreeNode(TreeNodeCollection notes, DataTable dataTB, string parentID) { DataRow[] rows = dataTB.Select("[parentid]='" + parentID + "'"); foreach (DataRow row in rows) { TreeNode newNode = new TreeNode(); newNode.Value = row["id"].ToString(); newNode.Text = row["chinesename"].ToString(); notes.Add(newNode); this.BindTreeNode(notes, dataTB, newNode.Value); } }这样的话全部都编成根目录了 请问零零伍:我怎么提示TreeNodeCollection 出错,查msdn是windows继承的类? oh~不好意思,搞错了 private void BindTreeNode(TreeNodeCollection notes, DataTable dataTB, string parentID) { DataRow[] rows = dataTB.Select("[parentid]='" + parentID + "'"); foreach (DataRow row in rows) { TreeNode newNode = new TreeNode(); newNode.Value = row["id"].ToString(); newNode.Text = row["chinesename"].ToString(); notes.Add(newNode); this.BindTreeNode(newNode.ChildNodes, dataTB, newNode.Value); } }这样才对。谢谢Eddie005(♂) №.零零伍 的算法,确实不错 private void InitTreeView(TreeNodeCollection nds,int nodeid) { DataRow[] noderows = ds.Tables[0].Select("ParentID="+nodeid); TreeNode node; foreach (DataRow row in noderows) { node = new TreeNode(); node.Value = row["id"].ToString(); node.Text = row["Name"].ToString(); nds.Add(node); InitTreeView(node.ChildNodes, Convert.ToInt32(row["WebID"].ToString())); }}用上面这个递归 我这个表的结构是ID UnitName PID我的程序是这样写的,你可以小改下,原理是第一步把PID=0的取出来,然后再递归读下面的。 private void BiudTree() { Units sm=new Units(); DataTable dt=sm.GetList("DelSign='0'").Tables[0]; this.dopUnits.Items.Clear(); //加载树 //this.dopUnits.Items.Add(new ListItem("根目录","0")); DataRow [] drs = dt.Select("PID= " + 0); foreach( DataRow r in drs ) { string nodeid=r["ID"].ToString(); string text=r["UnitName"].ToString(); //string parentid=r["ParentID"].ToString(); //string permissionid=r["PermissionID"].ToString(); text="╋"+text; this.dopUnits.Items.Add(new ListItem(text,nodeid)); int sonparentid=int.Parse(nodeid); string blank="├"; BindNode( sonparentid, dt,blank); } this.dopUnits.DataBind(); } private void BindNode(int parentid,DataTable dt,string blank) { DataRow [] drs = dt.Select("PID= " + parentid ); foreach( DataRow r in drs ) { string nodeid=r["ID"].ToString(); string text=r["UnitName"].ToString(); //string permissionid=r["PermissionID"].ToString(); text=blank+"『"+text+"』"; this.dopUnits.Items.Add(new ListItem(text,nodeid)); int sonparentid=int.Parse(nodeid); string blank2=blank+"─"; BindNode( sonparentid, dt,blank2); } } 楼主,在vs2005中,用treeview控件,运行出错!!!这行:newNode.ID = row["f_NodeId"].ToString();报newNode不包含id的属性 怎么回事??高手是用2003做的? 将newNode.ID = row["f_NodeId"].ToString();改为newNode.value = row["f_NodeId"].ToString();就可以了,这是vs2005和vs2003的区别 不错,我也用Eddie005(♂) №.零零伍的递归作出来,感谢Eddie005(♂) №.零零伍! 配置文件生成成功,但运行报错 程序调试没有错误 发布就会报错 js实现网页全屏(效果和F11一样) 做的网上购物系统内容一被修改就无法运行,是如何做到的?? VS2005里面如何 实现页面的下载功能 [馨郁星愿]关于手机号码过滤~~~ Windows和Forms身份验证 URL重写,怎么让传过去的id转换成用户名后,在重写URL(顶者有分) automation服务器不能创建对象 ASP.NET创建WebService供Java调用 我这样做会不会被百度认为是在作弊? 在csdn中看了一技术文章.看完很纳闷.请高人解答..[说分层思想]
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
if(!Page.IsPostBack)
{
DataTable dt = new DataTable();
dt.Columns.Add("f_i_autoid");
dt.Columns.Add("f_NodeId");
dt.Columns.Add("f_ParentNodeId");
dt.Columns.Add("f_Name");
dt.Rows.Add(new object[]{1,1,0,"AAA"});
dt.Rows.Add(new object[]{2,2,0,"BBB"});
dt.Rows.Add(new object[]{3,3,0,"CCC"});
dt.Rows.Add(new object[]{4,4,1,"DDD"});
dt.Rows.Add(new object[]{6,6,2,"EEE"});
dt.Rows.Add(new object[]{7,7,3,"FFF"});
dt.Rows.Add(new object[]{8,8,6,"GGG"});
dt.Rows.Add(new object[]{9,9,7,"HHH"});
this.DataList1.DataSource = dt;
this.DataList1.DataBind();
}
}/// <summary>
/// 用递归方法将数据中查询的数据添加TreeView控件的节点
/// </summary>
private void BindTreeNode(TreeNodeCollection notes,DataTable dataTB,string parentID)
{
DataRow[] rows = dataTB.Select("[f_ParentNodeId]='" + parentID + "'"); foreach(DataRow row in rows)
{
TreeNode newNode = new TreeNode();
newNode.ID = row["f_NodeId"].ToString();
newNode.Text = row["f_Name"].ToString();
notes.Add(newNode);
this.BindTreeNode(newNode.Nodes,dataTB,newNode.ID);
}
}
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
if(!Page.IsPostBack)
{
DataTable dt = new DataTable();
dt.Columns.Add("f_i_autoid");
dt.Columns.Add("f_NodeId");
dt.Columns.Add("f_ParentNodeId");
dt.Columns.Add("f_Name");
dt.Rows.Add(new object[]{1,1,0,"AAA"});
dt.Rows.Add(new object[]{2,2,0,"BBB"});
dt.Rows.Add(new object[]{3,3,0,"CCC"});
dt.Rows.Add(new object[]{4,4,1,"DDD"});
dt.Rows.Add(new object[]{6,6,2,"EEE"});
dt.Rows.Add(new object[]{7,7,3,"FFF"});
dt.Rows.Add(new object[]{8,8,6,"GGG"});
dt.Rows.Add(new object[]{9,9,7,"HHH"}); this.BindTreeNode(this.TreeView1.Nodes,dt,"0");
}
}/// <summary>
/// 用递归方法将数据中查询的数据添加TreeView控件的节点
/// </summary>
private void BindTreeNode(TreeNodeCollection notes,DataTable dataTB,string parentID)
{
DataRow[] rows = dataTB.Select("[f_ParentNodeId]='" + parentID + "'"); foreach(DataRow row in rows)
{
TreeNode newNode = new TreeNode();
newNode.ID = row["f_NodeId"].ToString();
newNode.Text = row["f_Name"].ToString();
notes.Add(newNode);
this.BindTreeNode(newNode.Nodes,dataTB,newNode.ID);
}
}
private void BindTreeNode(TreeNodeCollection notes, DataTable dataTB, string parentID)
{
DataRow[] rows = dataTB.Select("[parentid]='" + parentID + "'"); foreach (DataRow row in rows)
{
TreeNode newNode = new TreeNode();
newNode.Value = row["id"].ToString();
newNode.Text = row["chinesename"].ToString();
notes.Add(newNode);
this.BindTreeNode(notes, dataTB, newNode.Value); }
}这样的话全部都编成根目录了
我怎么提示TreeNodeCollection 出错,查msdn是windows继承的类?
{
DataRow[] rows = dataTB.Select("[parentid]='" + parentID + "'"); foreach (DataRow row in rows)
{
TreeNode newNode = new TreeNode();
newNode.Value = row["id"].ToString();
newNode.Text = row["chinesename"].ToString();
notes.Add(newNode);
this.BindTreeNode(newNode.ChildNodes, dataTB, newNode.Value);
}
}这样才对。谢谢Eddie005(♂) №.零零伍 的算法,确实不错
{
DataRow[] noderows = ds.Tables[0].Select("ParentID="+nodeid);
TreeNode node;
foreach (DataRow row in noderows)
{
node = new TreeNode();
node.Value = row["id"].ToString();
node.Text = row["Name"].ToString();
nds.Add(node);
InitTreeView(node.ChildNodes, Convert.ToInt32(row["WebID"].ToString()));
}
}用上面这个递归
ID UnitName PID
我的程序是这样写的,你可以小改下,原理是第一步把PID=0的取出来,然后再递归读下面的。
private void BiudTree()
{
Units sm=new Units();
DataTable dt=sm.GetList("DelSign='0'").Tables[0];
this.dopUnits.Items.Clear();
//加载树
//this.dopUnits.Items.Add(new ListItem("根目录","0"));
DataRow [] drs = dt.Select("PID= " + 0);
foreach( DataRow r in drs )
{
string nodeid=r["ID"].ToString();
string text=r["UnitName"].ToString();
//string parentid=r["ParentID"].ToString();
//string permissionid=r["PermissionID"].ToString();
text="╋"+text;
this.dopUnits.Items.Add(new ListItem(text,nodeid));
int sonparentid=int.Parse(nodeid);
string blank="├";
BindNode( sonparentid, dt,blank); }
this.dopUnits.DataBind(); }
private void BindNode(int parentid,DataTable dt,string blank)
{
DataRow [] drs = dt.Select("PID= " + parentid );
foreach( DataRow r in drs )
{
string nodeid=r["ID"].ToString();
string text=r["UnitName"].ToString();
//string permissionid=r["PermissionID"].ToString();
text=blank+"『"+text+"』";
this.dopUnits.Items.Add(new ListItem(text,nodeid));
int sonparentid=int.Parse(nodeid);
string blank2=blank+"─";
BindNode( sonparentid, dt,blank2);
}
}
newNode.ID = row["f_NodeId"].ToString();报newNode不包含id的属性
怎么回事??高手是用2003做的?
改为newNode.value = row["f_NodeId"].ToString();
就可以了,这是vs2005和vs2003的区别