C# winform treeview的无限分级 我想实现无限分级,原理是懂得 就是不知道如何实现,请高手赐教,谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 01. //实现多级目录 02. // 03. public string rootFT_Id = "00";//根节点Tag04. /// 05. /// 添加根节点 06. private void AddRootCompany() 07. { 08. DataSet ds = new DataSet(); 09. using (SqlConnection con = new SqlConnection("Data Source=localhost;uid=sa;pwd=;Database=TW_KJ")) 10. { 11. con.Open(); 12. string strSQL = "select * from TB_Personnel_Type where FT_ID ="+ rootFT_Id; 13. using (SqlDataAdapter adapter = new SqlDataAdapter(strSQL, con)) 14. { 15. adapter.Fill(ds); 16. } 17. TreeNode NewNode = new TreeNode(); 18. NewNode.Text = ds.Tables[0].Rows[0]["FT_NAME"].ToString().Trim(); 19. this.treeView1.Nodes.Add(NewNode); 20. InitTreeCompanyChildNode(NewNode,rootFT_Id); 21. } 22. } 23. public DataSet getMenuByLevel(string strFT_ID) 24. { 25. DataSet ds = new DataSet(); 26. using (SqlConnection con = new SqlConnection("Data Source=localhost;uid=sa;pwd=;Database=TW_KJ")) 27. { 28. con.Open(); 29. string strSQL; 30. if (strFT_ID == "00") 31. { 32. strSQL = "select * from TB_Personnel_Type where FT_ID like'" + "0_' and FT_UP_NO = 1"; 33. } 34. else 35. { 36. strSQL = "select * from TB_Personnel_Type where FT_ID like'" + strFT_ID.Trim() + "__'"; 37. } 38. using (SqlDataAdapter adapter = new SqlDataAdapter(strSQL, con)) 39. { 40. adapter.Fill(ds); 41. } 42. } 43. return ds; 44. } 45. 46. /// 47. /// 递归获取子节点 48. private void InitTreeCompanyChildNode(TreeNode pNode, string fatherFT_ID) 49. { 50. DataSet ds = getMenuByLevel(fatherFT_ID); 51. DataView dataView = new DataView(); 52. dataView = ds.Tables[0].DefaultView; 53. foreach (DataRowView drv in dataView) 54. { 55. string newFT_ID = drv["FT_ID"].ToString(); 56. string name = drv["FT_NAME"].ToString(); 57. TreeNode NewNode = new TreeNode(); 58. //将子节点添加到父节点下面 59. NewNode.Text = name; 60. pNode.Nodes.Add(NewNode); 61. InitTreeCompanyChildNode(NewNode,newFT_ID); 62. } 63. } 64. 65. private void Property_Load(object sender, EventArgs e) 66. { 67. AddRootCompany(); 68. 69. } 我做过的例子,你参考一下。主要是要知道节点的所有子节点,然后用递归从根节点开始添加他的所有子节点 存放树的类,这里可以读取数据库,按规范存放数据。 /// <summary> /// 实体类 客户信息树形视图展现 /// </summary> public class ZBZone:BasicCheck,ICloneable { public ZBZone() { } public object Clone() { return this.MemberwiseClone(); } private string parentid; /// <summary> /// 父节点名称 /// </summary> public string ParentID { get { return parentid; } set { if(value.ToString().IndexOf(',')!=-1) parentid = value; } } private string codeid; /// <summary> ///用户id号 /// </summary> public string CodeID { get { return codeid; } set { codeid = value; } } private string codename; /// <summary> ///用户名称 /// </summary> public string CodeName { get { return codename; } set { codename = value; } } } /// <summary> /// 构造父节点树 /// </summary> /// <param name="trc">树集合</param> /// <param name="lzb">实体集合</param> private void TreeViewLoad(TreeNodeCollection trc,List<ZBZone> lzb) { treeview_customer.Nodes.Clear(); foreach (ZBZone zb in lzb) { int icount = zb.ParentID.Split(',').Count(); if (icount == 2) { TreeNode tn = new TreeNode(zb.CodeName); tn.Tag = zb;//设置tag属性 tn.ImageIndex = 0; trc.Add(tn); treeview_customer.Nodes[0].ExpandAll(); } else { InitChildNode(trc[trc.Count - 1].Nodes,zb,zb.ParentID); } } } /// <summary> /// 递归构造子节点 /// </summary> /// <param name="trchild">父节点集合</param> /// <param name="strparent">parentid长度</param> /// <param name="name">节点名称</param> private void InitChildNode(TreeNodeCollection trchild, ZBZone zbz,string parentid) { string stemp = parentid; if (stemp.IndexOf(',') != 0) { stemp = stemp.Substring(0, stemp.LastIndexOf(',')); int icount = stemp.Split(',').Count(); if (icount ==2) { TreeNode tn1 = new TreeNode(zbz.CodeName); tn1.Tag = zbz; trchild.Add(tn1); } else { InitChildNode(trchild[trchild.Count - 1].Nodes, zbz, stemp); } } }//加载树 调用 List<ZBZone> zbzone = new List<ZBZone>(); zbzone.AddRange(new ZBZone[] {new ZBZone{ ParentID="1,1" ,CodeID="1", CodeName="ONE"}, new ZBZone{ ParentID="1,1,1" ,CodeID="2", CodeName="ONE-1"}, new ZBZone{ ParentID="1,1,1,2" ,CodeID="5", CodeName="ONE-1-2"}, new ZBZone{ ParentID="2,2" ,CodeID="6", CodeName="TWO"}}); TreeViewLoad(treeview_customer.Nodes, zbzone);//树名称你可以按这个方法,扩展。 用无限递归就没问题,最近刚刚就是用这个方法实现的。 foreach( IDomainUser item in list ) { int treeViewId = Convert.ToInt32( item.TreeViewId ); string branchName = string.Empty; string branchImage = string.Empty; if( item.GetType().Equals( typeof( DomainNameUI ) ) ) { DomainNameUI data = ( DomainNameUI )item; branchName = data.NameString; branchImage = SetCreateConstants.Image_Url_Domain; } else if( item.GetType().Equals( typeof( OuUI ) ) ) { OuUI data = ( OuUI )item; branchName = data.NameString; branchImage = SetCreateConstants.Image_Url_Ou; } else { return; } TreeComponent child = tree.CreateTreeBranch( treeViewId, branchName, null, branchImage ); parent.Add( child ); List<IDomainUser> ouList = item.GetOUList(); if( ouList != null && ouList.Count > 0 ) { CreateTreeViewBranch( tree, child, ouList ); } } 递归,,看你的表结构是否符合private void bindTreeView1() { string sql = "select * from doctype where isdel=0"; DataTable dt = db.ExecuteDataTable(sql, CommandType.Text, null); DataRow[] dr=dt.Select("updirid='-1'"); for (int i = 0; i < dr.Length; i++) { TreeNode tn = new TreeNode(); tn.Text = dr[i]["docdirname"].ToString(); tn.Tag=dr[i]["docdirid"].ToString(); if (dr[i]["isdir"].ToString() == "1") FillTree(tn, dt); treeView1.Nodes.Add(tn); } } private void FillTree(TreeNode node, DataTable dt) { DataRow[] dd = dt.Select("updirid='"+node.Tag.ToString()+"'"); if (dd.Length > 0) { for (int i = 0; i < dd.Length; i++) { TreeNode tnn = new TreeNode(); tnn.Text = dd[i]["docdirname"].ToString(); tnn.Tag = dd[i]["docdirid"].ToString(); if (dd[i]["isdir"].ToString() == "1") FillTree(tnn, dt); node.Nodes.Add(tnn); } } } 咦??你之前不是发过该帖子嘛?怎么你没有解决啊????你的帖子地址:http://topic.csdn.net/u/20110818/12/9bca95d8-c21a-4c6c-af7b-055151b978ea.html winform中的datagridview问题 求.net进阶指导 WinForm ListView添加TextBox C# 窗体程序 关于TreeView节点增删改并同时写入数据库 关于visual studio安装项目 TreeView与DataGirdView Gridview中的按钮使用 C#在WIN下的数据库绑定???着急那!!! 概念不清:请问.NET组件如何代替COM组件,以及它在客户端的权限。 C# WinForm :启动自己的程序后(加载在系统托盘内),无法关闭Windows2000! 20分 关于ASP 无组件上传中文存入到数据库时出现乱码 求正则表达式。
01. //实现多级目录
02. //
03. public string rootFT_Id = "00";//根节点Tag
04. ///
05. /// 添加根节点
06. private void AddRootCompany()
07. {
08. DataSet ds = new DataSet();
09. using (SqlConnection con = new SqlConnection("Data Source=localhost;uid=sa;pwd=;Database=TW_KJ"))
10. {
11. con.Open();
12. string strSQL = "select * from TB_Personnel_Type where FT_ID ="+ rootFT_Id;
13. using (SqlDataAdapter adapter = new SqlDataAdapter(strSQL, con))
14. {
15. adapter.Fill(ds);
16. }
17. TreeNode NewNode = new TreeNode();
18. NewNode.Text = ds.Tables[0].Rows[0]["FT_NAME"].ToString().Trim();
19. this.treeView1.Nodes.Add(NewNode);
20. InitTreeCompanyChildNode(NewNode,rootFT_Id);
21. }
22. }
23. public DataSet getMenuByLevel(string strFT_ID)
24. {
25. DataSet ds = new DataSet();
26. using (SqlConnection con = new SqlConnection("Data Source=localhost;uid=sa;pwd=;Database=TW_KJ"))
27. {
28. con.Open();
29. string strSQL;
30. if (strFT_ID == "00")
31. {
32. strSQL = "select * from TB_Personnel_Type where FT_ID like'" + "0_' and FT_UP_NO = 1";
33. }
34. else
35. {
36. strSQL = "select * from TB_Personnel_Type where FT_ID like'" + strFT_ID.Trim() + "__'";
37. }
38. using (SqlDataAdapter adapter = new SqlDataAdapter(strSQL, con))
39. {
40. adapter.Fill(ds);
41. }
42. }
43. return ds;
44. }
45.
46. ///
47. /// 递归获取子节点
48. private void InitTreeCompanyChildNode(TreeNode pNode, string fatherFT_ID)
49. {
50. DataSet ds = getMenuByLevel(fatherFT_ID);
51. DataView dataView = new DataView();
52. dataView = ds.Tables[0].DefaultView;
53. foreach (DataRowView drv in dataView)
54. {
55. string newFT_ID = drv["FT_ID"].ToString();
56. string name = drv["FT_NAME"].ToString();
57. TreeNode NewNode = new TreeNode();
58. //将子节点添加到父节点下面
59. NewNode.Text = name;
60. pNode.Nodes.Add(NewNode);
61. InitTreeCompanyChildNode(NewNode,newFT_ID);
62. }
63. }
64.
65. private void Property_Load(object sender, EventArgs e)
66. {
67. AddRootCompany();
68.
69. } 我做过的例子,你参考一下。
主要是要知道节点的所有子节点,然后用递归从根节点开始添加他的所有子节点
/// 实体类 客户信息树形视图展现
/// </summary>
public class ZBZone:BasicCheck,ICloneable
{
public ZBZone() { }
public object Clone()
{
return this.MemberwiseClone();
}
private string parentid;
/// <summary>
/// 父节点名称
/// </summary>
public string ParentID
{
get { return parentid; }
set {
if(value.ToString().IndexOf(',')!=-1)
parentid = value;
}
} private string codeid;
/// <summary>
///用户id号
/// </summary>
public string CodeID
{
get { return codeid; }
set { codeid = value; }
} private string codename;
/// <summary>
///用户名称
/// </summary>
public string CodeName
{
get { return codename; }
set { codename = value; }
} } /// <summary>
/// 构造父节点树
/// </summary>
/// <param name="trc">树集合</param>
/// <param name="lzb">实体集合</param>
private void TreeViewLoad(TreeNodeCollection trc,List<ZBZone> lzb)
{
treeview_customer.Nodes.Clear();
foreach (ZBZone zb in lzb)
{
int icount = zb.ParentID.Split(',').Count();
if (icount == 2)
{
TreeNode tn = new TreeNode(zb.CodeName);
tn.Tag = zb;//设置tag属性
tn.ImageIndex = 0;
trc.Add(tn);
treeview_customer.Nodes[0].ExpandAll();
}
else
{
InitChildNode(trc[trc.Count - 1].Nodes,zb,zb.ParentID);
}
}
}
/// <summary>
/// 递归构造子节点
/// </summary>
/// <param name="trchild">父节点集合</param>
/// <param name="strparent">parentid长度</param>
/// <param name="name">节点名称</param>
private void InitChildNode(TreeNodeCollection trchild, ZBZone zbz,string parentid)
{
string stemp = parentid;
if (stemp.IndexOf(',') != 0)
{
stemp = stemp.Substring(0, stemp.LastIndexOf(','));
int icount = stemp.Split(',').Count();
if (icount ==2)
{
TreeNode tn1 = new TreeNode(zbz.CodeName);
tn1.Tag = zbz;
trchild.Add(tn1);
}
else
{
InitChildNode(trchild[trchild.Count - 1].Nodes, zbz, stemp);
}
}
}//加载树 调用
List<ZBZone> zbzone = new List<ZBZone>();
zbzone.AddRange(new ZBZone[]
{new ZBZone{ ParentID="1,1" ,CodeID="1", CodeName="ONE"},
new ZBZone{ ParentID="1,1,1" ,CodeID="2", CodeName="ONE-1"},
new ZBZone{ ParentID="1,1,1,2" ,CodeID="5", CodeName="ONE-1-2"},
new ZBZone{ ParentID="2,2" ,CodeID="6", CodeName="TWO"}});
TreeViewLoad(treeview_customer.Nodes, zbzone);//树名称
你可以按这个方法,扩展。
foreach( IDomainUser item in list )
{
int treeViewId = Convert.ToInt32( item.TreeViewId );
string branchName = string.Empty;
string branchImage = string.Empty; if( item.GetType().Equals( typeof( DomainNameUI ) ) )
{
DomainNameUI data = ( DomainNameUI )item;
branchName = data.NameString;
branchImage = SetCreateConstants.Image_Url_Domain;
}
else if( item.GetType().Equals( typeof( OuUI ) ) )
{
OuUI data = ( OuUI )item;
branchName = data.NameString;
branchImage = SetCreateConstants.Image_Url_Ou;
}
else
{
return;
}
TreeComponent child = tree.CreateTreeBranch( treeViewId, branchName, null, branchImage );
parent.Add( child );
List<IDomainUser> ouList = item.GetOUList();
if( ouList != null && ouList.Count > 0 )
{
CreateTreeViewBranch( tree, child, ouList );
}
}
递归,,看你的表结构是否符合
private void bindTreeView1()
{
string sql = "select * from doctype where isdel=0";
DataTable dt = db.ExecuteDataTable(sql, CommandType.Text, null);
DataRow[] dr=dt.Select("updirid='-1'");
for (int i = 0; i < dr.Length; i++)
{
TreeNode tn = new TreeNode();
tn.Text = dr[i]["docdirname"].ToString();
tn.Tag=dr[i]["docdirid"].ToString();
if (dr[i]["isdir"].ToString() == "1")
FillTree(tn, dt);
treeView1.Nodes.Add(tn);
}
} private void FillTree(TreeNode node, DataTable dt)
{
DataRow[] dd = dt.Select("updirid='"+node.Tag.ToString()+"'");
if (dd.Length > 0)
{
for (int i = 0; i < dd.Length; i++)
{
TreeNode tnn = new TreeNode();
tnn.Text = dd[i]["docdirname"].ToString();
tnn.Tag = dd[i]["docdirid"].ToString();
if (dd[i]["isdir"].ToString() == "1")
FillTree(tnn, dt);
node.Nodes.Add(tnn);
}
}
}
你的帖子地址:
http://topic.csdn.net/u/20110818/12/9bca95d8-c21a-4c6c-af7b-055151b978ea.html