难题,老大们看看。我要用树型结构来显示信息,方法是用递归来实现。

时间:2021-05-28 12:59:40
用treeView控件作了一个,但是显示的结果是平级的(这里说明,我指的是第三个子节点,和第二个子节点);举例子:中国--北京(平等有上海,广东等等)---海淀区(有平等区县)---上地(有平等地方)---路名。  首先我要做的,意思和这个一样,数据库已经创建好,并在VB里实现,现在我要用C#来实现这个结构,但总是用递归读取不了下一个节点,(也就是说:上地和海淀区是同一个节点,然后就是路名)。 这个下一个节点的方法,是怎样的?????  还请高手指教!!!!!   等待中。。。。

28 个解决方案

#1


顶!

#2


顶!

#3


把表结构贴出来看看

#4


这个方法太多了,还是贴你的程序我们来抓错吧。

#5


名称       节点号
中国        01
城市a        0101
   a市1中心     010101
       1中心A区        01010101
       1中心B区        01010102
   a市2中心     010102
   a市3中心     010103
      3中心A区        01010301
城市b        0102
法国        02
城市a       0201
  a市1中心      020101
  a市2中心      020102

#6


/// BranchList 的摘要说明。
/// </summary>
public class BranchList : PageBaseIContentCn
{
protected Microsoft.Web.UI.WebControls.TreeView tvBranchList;
protected System.Web.UI.HtmlControls.HtmlGenericControl dvTree;

private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
this.InitBase();
if(!IsPostBack)
{
this.FillTreeView();
}
}
private void FillTreeView()
{
OrgChart OC = new OrgChart(ConfigurationSettings.AppSettings[C.SetingName.Oc].Trim());
OC.SetGroups = OrgChart.get_NodeBySystem(this.UserLoginCur.IdEmployee.Trim(),"IContent",ConfigurationSettings.AppSettings[C.SetingName.Oc].Trim());
OC.SetTarget = "frPickBuilding";
OC.Image_Url = "../images/admin.gif";
OC.Emp_Url = "PreviewPickBuilding.aspx";
OC.Group_Url = "PreviewPickBuilding.aspx";
foreach(Microsoft.Web.UI.WebControls.TreeNode Node in OC.BuildTreeNodes())
{
this.tvBranchList.Nodes.Add(Node);
//Node.Expanded = true;
}
//递归算法展开所有的子节点
foreach(Microsoft.Web.UI.WebControls.TreeNode node in this.tvBranchList.Nodes)
{
node.Expanded = true;
if(node.NavigateUrl.IndexOf("Group_ID=") == -1)
{
node.NavigateUrl = node.NavigateUrl.Substring(0,node.NavigateUrl.IndexOf("?")+1)+"Group_ID=";
}
else
{
node.NavigateUrl = node.NavigateUrl.Trim()+",";
}
//去掉图片
node.ImageUrl="";
this.ExpandNode(node);
//反向递归出子节点
string Path = "";
this.GetChildrenQueryString(node,ref Path);
//更正路径
this.CorrectPath(node);
}
}
/// <summary>
/// 更正路径
/// </summary>
/// <param name="node"></param>
private void CorrectPath(TreeNode node)
{
string[] paths = node.NavigateUrl.Split(',');
string path = "";
for(int i = 0 ; i < paths.Length ; i ++)
{
if(paths[i].Trim()!="")
{
if(path == "")
{
path += paths[i].Trim();
}
else
{
path += "," + paths[i].Trim();
}
}

}
node.NavigateUrl = path;
node.NavigateUrl += "&DeptName=" + Server.UrlEncode(node.Text.Trim());
foreach(TreeNode Node in node.Nodes)
{
this.CorrectPath(Node);
}
}
/// <summary>
/// 展开所有的节点
/// </summary>
/// <param name="node"></param>
private void ExpandNode(TreeNode node)
{
foreach(TreeNode Node in node.Nodes)
{
Node.Expanded = true;

if(Node.NavigateUrl.IndexOf("Group_ID=") == -1)
{
Node.NavigateUrl = Node.NavigateUrl.Substring(0,Node.NavigateUrl.IndexOf("?")+1)+"Group_ID=";
}
else
{
Node.NavigateUrl = Node.NavigateUrl.Trim() +",";
}
Node.ImageUrl="";
try
{
this.ExpandNode(Node);
}
catch
{
break;
}
}

}
/// <summary>
/// 反向递归出子节点
/// </summary>
/// <param name="node"></param>
/// <param name="UnderPath"></param>
private void GetChildrenQueryString(TreeNode node,ref string UnderPath)
{
string p = "";
if(node.Nodes.Count > 0 )
{
foreach(TreeNode Node in node.Nodes)
{
this.GetChildrenQueryString(Node,ref p);
p += this.ParsePath(Node).Trim()+",";
}
node.NavigateUrl += p;
}
}
/// <summary>
/// 分析出Group_ID
/// </summary>
/// <param name="node"></param>
/// <returns></returns>
private string ParsePath(TreeNode node)
{
string OriginalPath = node.NavigateUrl;
if(OriginalPath.IndexOf("Group_ID") == -1)
{
return "";
}
else
{
string ParsedPath = OriginalPath.Substring((OriginalPath.IndexOf("=")+1));
return ParsedPath.Trim();
}
}

#7


private void ShowForm(int ComID,int ParnID)
{
   //DataSet 已经取得      
   if(sqlDS.Tables[ParnID.ToString()].Rows.Count<=0)
   {
return;
   }
   else
  {

int i=0,num=0,k;
int typeid;
//string nodeNode,wnode,snode;

while(Count>0)
{ if(ParnID==0)  //数据库中的parnid 与 typeid 的关系是父子关系。 这里我是人为的判断,但是,递归以后,子节点还有节点,这时候就变成平级的了。 这个方法肯定不对,希望高手给与指教!!
{
    DataRow dr= sqlDS.Tables[ParnID.ToString()].Rows[i++];
    System.Windows.Forms.TreeNode nNode=new TreeNode(dr["ProName"].ToString());
    treeView1.TopNode.Nodes.Add(nNode);
    typeid = Convert.ToInt32(dr["TypeID"].ToString());

}
else
{

    DataRow drw = sqlDS.Tables[ParnID.ToString()].Rows[i++];
System.Windows.Forms.TreeNode aNode=new TreeNode(drw["ProName"].ToString());
treeView1.Nodes[0].Nodes[0].Nodes.Add(aNode);
typeid = Convert.ToInt32(drw["TypeID"].ToString());

}
ShowForm(ComID,typeid);
Count--;

}

}

}



}

#8


up

#9


ComID好象没有什么用啊。
感觉
while(Count>0)
{
    if(ParnID==0)
    {
        ...
    }
}
这个地方的coding有点混乱

#10


问一下 if(ParnID==0)是否是“如果没有父节点”

#11


treeView1.Nodes[0].Nodes[0].Nodes.Add(aNode);
这行代码肯定有问题。你打断点看看。

#12


ComID 是在之前的记录级里取得的。然后调用函数,给的值。 

不是,等于0在数据库里代表他是最初的根节点。

#13


我的程序已经运行,现在我想说的就是怎么创建下一个子节点,因为它是在递归里面的。
treeView1.Nodes[0].Nodes[0].Nodes.Add(aNode);--- 这一句是创建上一个的子节点,那么子节点的子节点呢???(现在感觉要有个变量) 如何创建??? 要怎么一样呢?

#14


你在递归中没有指明子节点是加到哪个节点下的呀???

建议你在递归中传入多一个参数
TreeNode currNode
表示当前节点,以便递归时知道把子节点插入到哪个节点

#15


这个参数是怎么写的阿?? --- private void ShowForm(TreeNode currNode,int ComID,int ParnID)

如何调用?? -- ShowForm(treeView1,ComID,0);

#16


看看下面这个思路,然后加上其他必要的代码就可以了

private void AddTopNodes()
{
         //*******************************************************
DataRow[] topNodes;//获取*节点的行。即代号为两位的节点
         //*******************************************************

foreach(DataRow topNode in topNodes)
{
TreeNode topTN = new TreeNode(topNode["ProName"].ToString());
this.treeView1.Nodes.Add(topTN);

DataRow[] childNodes = this.GetChildNodes(topNode["TypeID"].ToString());
foreach(DataRow childNode in childNodes)
{
this.AddChildNodes(topTN,childNode["TypeID"].ToString());
}
}
}

private void AddChildNodes(TreeNode currNode,string childNodeID)
{
TreeNode childTN = new TreeNode(this.GetNodeName(childNodeID));
currNode.Nodes.Add(childTN);

DataRow[] childNodes = this.GetChildNodes(childNodeID);
foreach(DataRow childNode in childNodes)
{
this.AddChildNodes(childTN,childNode["TypeID"].ToString());
}
}

private DataRow[] GetChildNodes(string currTypeID)
{
         //*******************************************************
         //获取给出代号节点的所有子节点的行集合
         //即  代号为给出代号长度加2,并且代号 like 'currTypeID%'的节点
         //*******************************************************         
}

private string GetNodeName(string nodeID)
{
         //*******************************************************
         //获取给出代号的节点名称
         //即  如为010101,则返回‘a市1中心’
         //*******************************************************
}

#17


我这边已经测试通过,下面是完整代码。

using System;
using System.Data;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;

namespace WindowsApplication1
{
/// <summary>
/// Form4 的摘要说明。
/// </summary>
public class Form4 : System.Windows.Forms.Form
{
private DataTable tNodes = new DataTable();

private System.Windows.Forms.TreeView treeView1;
private System.Windows.Forms.Button button1;
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null;

public Form4()
{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();

this.tNodes.Columns.Add("ProName",Type.GetType("System.String"));
this.tNodes.Columns.Add("TypeID",Type.GetType("System.String"));
this.tNodes.PrimaryKey = new DataColumn[]{this.tNodes.Columns["TypeID"]};

this.tNodes.Rows.Add(new object[]{"中国","01"});
this.tNodes.Rows.Add(new object[]{"城市a","0101"});
this.tNodes.Rows.Add(new object[]{"a市1中心","010101"});
this.tNodes.Rows.Add(new object[]{"1中心A区","01010101"});
this.tNodes.Rows.Add(new object[]{"1中心B区","01010102"});
this.tNodes.Rows.Add(new object[]{"a市2中心","010102"});
this.tNodes.Rows.Add(new object[]{"a市3中心","010103"});
this.tNodes.Rows.Add(new object[]{"3中心A区","01010301"});
this.tNodes.Rows.Add(new object[]{"城市b","0102"});
this.tNodes.Rows.Add(new object[]{"法国","02"});
this.tNodes.Rows.Add(new object[]{"城市a","0201"});
this.tNodes.Rows.Add(new object[]{"a市1中心","020101"});
this.tNodes.Rows.Add(new object[]{"a市2中心","020102"});
//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
}

/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region Windows 窗体设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.treeView1 = new System.Windows.Forms.TreeView();
this.button1 = new System.Windows.Forms.Button();
this.SuspendLayout();
// 
// treeView1
// 
this.treeView1.ImageIndex = -1;
this.treeView1.Location = new System.Drawing.Point(16, 16);
this.treeView1.Name = "treeView1";
this.treeView1.SelectedImageIndex = -1;
this.treeView1.Size = new System.Drawing.Size(296, 288);
this.treeView1.TabIndex = 0;
// 
// button1
// 
this.button1.Location = new System.Drawing.Point(328, 176);
this.button1.Name = "button1";
this.button1.TabIndex = 1;
this.button1.Text = "添加节点";
this.button1.Click += new System.EventHandler(this.button1_Click);
// 
// Form4
// 
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(408, 325);
this.Controls.Add(this.button1);
this.Controls.Add(this.treeView1);
this.Name = "Form4";
this.Text = "Form4";
this.ResumeLayout(false);

}
#endregion

/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main() 
{
Application.Run(new Form4());
}

private void AddTopNodes()
{
DataRow[] topNodes = this.tNodes.Select("Len(TypeID)=2");
foreach(DataRow topNode in topNodes)
{
TreeNode topTN = new TreeNode(topNode["ProName"].ToString());
this.treeView1.Nodes.Add(topTN);

DataRow[] childNodes = this.GetChildNodes(topNode["TypeID"].ToString());
foreach(DataRow childNode in childNodes)
{
this.AddChildNodes(topTN,childNode["TypeID"].ToString());
}
}
}

private void AddChildNodes(TreeNode currNode,string childNodeID)
{
TreeNode childTN = new TreeNode(this.GetNodeName(childNodeID));
currNode.Nodes.Add(childTN);

DataRow[] childNodes = this.GetChildNodes(childNodeID);
foreach(DataRow childNode in childNodes)
{
this.AddChildNodes(childTN,childNode["TypeID"].ToString());
}
}

private DataRow[] GetChildNodes(string currTypeID)
{
return this.tNodes.Select("Len(TypeID)="+(currTypeID.Length+2).ToString()+" AND TypeID Like '"+currTypeID+"%'");
}

private string GetNodeName(string nodeID)
{
DataRow pk = this.tNodes.Rows.Find(nodeID);
if(pk!=null)
{
return pk["ProName"].ToString();
}
else
{
return string.Empty;
}
}

private void button1_Click(object sender, System.EventArgs e)
{
this.AddTopNodes();
this.button1.Enabled = false;
}
}
}

#18


关注

#19


唉,好长的代码,帮你顶一下好了。

#20


不好意思,这个还是不太明白。 请说明一下。
private DataRow[] GetChildNodes(string currTypeID)
{
         //*******************************************************
         //获取给出代号节点的所有子节点的行集合
         //即  代号为给出代号长度加2,并且代号 like 'currTypeID%'的节点
         //*******************************************************         
}

#21


lj码真多啊

#22


接着问,在之前我的DataSet是这样做的:DataSet sqlDS = new DataSet();   sqlDOA.Fill(sqlDS,ParnID.ToString()); 现在你的是DataTable 我应该如何改呢?  还有我的判断节点的条件是根据sql语句的查询,而你是在table对象里面的判断,我这里应该怎么做呢? tNodes.Select这里面可以写什么,查询语句????

#23


簡單照Vb的思路,將語法更改!
我就是這樣做得

#24


我的结构是
TypeID  ParnID
36      0
37      0
38      36
39      36
40      36
41      36
42      41
43      36
44      36
45      37
46      37
47      37
48      37
49      37
60      0
61      60
62      60

#25


着急啊!!!

#26


zhongjy001(.) 
代碼都已經實現了

#27


DataSet相当于是一个数据库
Table 是DataSet中的一个表

取Table具体得看你填充DataSet使用的Sql语句,
即sqlDOA.Fill(sqlDS,ParnID.ToString()); 中的ParnID是什么

你把它帖出来看看

#28


zhongjy001(.) 谢谢了。照你的思路我已经做出来了,今后还希望能够多多指教,感谢!!!

#1


顶!

#2


顶!

#3


把表结构贴出来看看

#4


这个方法太多了,还是贴你的程序我们来抓错吧。

#5


名称       节点号
中国        01
城市a        0101
   a市1中心     010101
       1中心A区        01010101
       1中心B区        01010102
   a市2中心     010102
   a市3中心     010103
      3中心A区        01010301
城市b        0102
法国        02
城市a       0201
  a市1中心      020101
  a市2中心      020102

#6


/// BranchList 的摘要说明。
/// </summary>
public class BranchList : PageBaseIContentCn
{
protected Microsoft.Web.UI.WebControls.TreeView tvBranchList;
protected System.Web.UI.HtmlControls.HtmlGenericControl dvTree;

private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
this.InitBase();
if(!IsPostBack)
{
this.FillTreeView();
}
}
private void FillTreeView()
{
OrgChart OC = new OrgChart(ConfigurationSettings.AppSettings[C.SetingName.Oc].Trim());
OC.SetGroups = OrgChart.get_NodeBySystem(this.UserLoginCur.IdEmployee.Trim(),"IContent",ConfigurationSettings.AppSettings[C.SetingName.Oc].Trim());
OC.SetTarget = "frPickBuilding";
OC.Image_Url = "../images/admin.gif";
OC.Emp_Url = "PreviewPickBuilding.aspx";
OC.Group_Url = "PreviewPickBuilding.aspx";
foreach(Microsoft.Web.UI.WebControls.TreeNode Node in OC.BuildTreeNodes())
{
this.tvBranchList.Nodes.Add(Node);
//Node.Expanded = true;
}
//递归算法展开所有的子节点
foreach(Microsoft.Web.UI.WebControls.TreeNode node in this.tvBranchList.Nodes)
{
node.Expanded = true;
if(node.NavigateUrl.IndexOf("Group_ID=") == -1)
{
node.NavigateUrl = node.NavigateUrl.Substring(0,node.NavigateUrl.IndexOf("?")+1)+"Group_ID=";
}
else
{
node.NavigateUrl = node.NavigateUrl.Trim()+",";
}
//去掉图片
node.ImageUrl="";
this.ExpandNode(node);
//反向递归出子节点
string Path = "";
this.GetChildrenQueryString(node,ref Path);
//更正路径
this.CorrectPath(node);
}
}
/// <summary>
/// 更正路径
/// </summary>
/// <param name="node"></param>
private void CorrectPath(TreeNode node)
{
string[] paths = node.NavigateUrl.Split(',');
string path = "";
for(int i = 0 ; i < paths.Length ; i ++)
{
if(paths[i].Trim()!="")
{
if(path == "")
{
path += paths[i].Trim();
}
else
{
path += "," + paths[i].Trim();
}
}

}
node.NavigateUrl = path;
node.NavigateUrl += "&DeptName=" + Server.UrlEncode(node.Text.Trim());
foreach(TreeNode Node in node.Nodes)
{
this.CorrectPath(Node);
}
}
/// <summary>
/// 展开所有的节点
/// </summary>
/// <param name="node"></param>
private void ExpandNode(TreeNode node)
{
foreach(TreeNode Node in node.Nodes)
{
Node.Expanded = true;

if(Node.NavigateUrl.IndexOf("Group_ID=") == -1)
{
Node.NavigateUrl = Node.NavigateUrl.Substring(0,Node.NavigateUrl.IndexOf("?")+1)+"Group_ID=";
}
else
{
Node.NavigateUrl = Node.NavigateUrl.Trim() +",";
}
Node.ImageUrl="";
try
{
this.ExpandNode(Node);
}
catch
{
break;
}
}

}
/// <summary>
/// 反向递归出子节点
/// </summary>
/// <param name="node"></param>
/// <param name="UnderPath"></param>
private void GetChildrenQueryString(TreeNode node,ref string UnderPath)
{
string p = "";
if(node.Nodes.Count > 0 )
{
foreach(TreeNode Node in node.Nodes)
{
this.GetChildrenQueryString(Node,ref p);
p += this.ParsePath(Node).Trim()+",";
}
node.NavigateUrl += p;
}
}
/// <summary>
/// 分析出Group_ID
/// </summary>
/// <param name="node"></param>
/// <returns></returns>
private string ParsePath(TreeNode node)
{
string OriginalPath = node.NavigateUrl;
if(OriginalPath.IndexOf("Group_ID") == -1)
{
return "";
}
else
{
string ParsedPath = OriginalPath.Substring((OriginalPath.IndexOf("=")+1));
return ParsedPath.Trim();
}
}

#7


private void ShowForm(int ComID,int ParnID)
{
   //DataSet 已经取得      
   if(sqlDS.Tables[ParnID.ToString()].Rows.Count<=0)
   {
return;
   }
   else
  {

int i=0,num=0,k;
int typeid;
//string nodeNode,wnode,snode;

while(Count>0)
{ if(ParnID==0)  //数据库中的parnid 与 typeid 的关系是父子关系。 这里我是人为的判断,但是,递归以后,子节点还有节点,这时候就变成平级的了。 这个方法肯定不对,希望高手给与指教!!
{
    DataRow dr= sqlDS.Tables[ParnID.ToString()].Rows[i++];
    System.Windows.Forms.TreeNode nNode=new TreeNode(dr["ProName"].ToString());
    treeView1.TopNode.Nodes.Add(nNode);
    typeid = Convert.ToInt32(dr["TypeID"].ToString());

}
else
{

    DataRow drw = sqlDS.Tables[ParnID.ToString()].Rows[i++];
System.Windows.Forms.TreeNode aNode=new TreeNode(drw["ProName"].ToString());
treeView1.Nodes[0].Nodes[0].Nodes.Add(aNode);
typeid = Convert.ToInt32(drw["TypeID"].ToString());

}
ShowForm(ComID,typeid);
Count--;

}

}

}



}

#8


up

#9


ComID好象没有什么用啊。
感觉
while(Count>0)
{
    if(ParnID==0)
    {
        ...
    }
}
这个地方的coding有点混乱

#10


问一下 if(ParnID==0)是否是“如果没有父节点”

#11


treeView1.Nodes[0].Nodes[0].Nodes.Add(aNode);
这行代码肯定有问题。你打断点看看。

#12


ComID 是在之前的记录级里取得的。然后调用函数,给的值。 

不是,等于0在数据库里代表他是最初的根节点。

#13


我的程序已经运行,现在我想说的就是怎么创建下一个子节点,因为它是在递归里面的。
treeView1.Nodes[0].Nodes[0].Nodes.Add(aNode);--- 这一句是创建上一个的子节点,那么子节点的子节点呢???(现在感觉要有个变量) 如何创建??? 要怎么一样呢?

#14


你在递归中没有指明子节点是加到哪个节点下的呀???

建议你在递归中传入多一个参数
TreeNode currNode
表示当前节点,以便递归时知道把子节点插入到哪个节点

#15


这个参数是怎么写的阿?? --- private void ShowForm(TreeNode currNode,int ComID,int ParnID)

如何调用?? -- ShowForm(treeView1,ComID,0);

#16


看看下面这个思路,然后加上其他必要的代码就可以了

private void AddTopNodes()
{
         //*******************************************************
DataRow[] topNodes;//获取*节点的行。即代号为两位的节点
         //*******************************************************

foreach(DataRow topNode in topNodes)
{
TreeNode topTN = new TreeNode(topNode["ProName"].ToString());
this.treeView1.Nodes.Add(topTN);

DataRow[] childNodes = this.GetChildNodes(topNode["TypeID"].ToString());
foreach(DataRow childNode in childNodes)
{
this.AddChildNodes(topTN,childNode["TypeID"].ToString());
}
}
}

private void AddChildNodes(TreeNode currNode,string childNodeID)
{
TreeNode childTN = new TreeNode(this.GetNodeName(childNodeID));
currNode.Nodes.Add(childTN);

DataRow[] childNodes = this.GetChildNodes(childNodeID);
foreach(DataRow childNode in childNodes)
{
this.AddChildNodes(childTN,childNode["TypeID"].ToString());
}
}

private DataRow[] GetChildNodes(string currTypeID)
{
         //*******************************************************
         //获取给出代号节点的所有子节点的行集合
         //即  代号为给出代号长度加2,并且代号 like 'currTypeID%'的节点
         //*******************************************************         
}

private string GetNodeName(string nodeID)
{
         //*******************************************************
         //获取给出代号的节点名称
         //即  如为010101,则返回‘a市1中心’
         //*******************************************************
}

#17


我这边已经测试通过,下面是完整代码。

using System;
using System.Data;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;

namespace WindowsApplication1
{
/// <summary>
/// Form4 的摘要说明。
/// </summary>
public class Form4 : System.Windows.Forms.Form
{
private DataTable tNodes = new DataTable();

private System.Windows.Forms.TreeView treeView1;
private System.Windows.Forms.Button button1;
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null;

public Form4()
{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();

this.tNodes.Columns.Add("ProName",Type.GetType("System.String"));
this.tNodes.Columns.Add("TypeID",Type.GetType("System.String"));
this.tNodes.PrimaryKey = new DataColumn[]{this.tNodes.Columns["TypeID"]};

this.tNodes.Rows.Add(new object[]{"中国","01"});
this.tNodes.Rows.Add(new object[]{"城市a","0101"});
this.tNodes.Rows.Add(new object[]{"a市1中心","010101"});
this.tNodes.Rows.Add(new object[]{"1中心A区","01010101"});
this.tNodes.Rows.Add(new object[]{"1中心B区","01010102"});
this.tNodes.Rows.Add(new object[]{"a市2中心","010102"});
this.tNodes.Rows.Add(new object[]{"a市3中心","010103"});
this.tNodes.Rows.Add(new object[]{"3中心A区","01010301"});
this.tNodes.Rows.Add(new object[]{"城市b","0102"});
this.tNodes.Rows.Add(new object[]{"法国","02"});
this.tNodes.Rows.Add(new object[]{"城市a","0201"});
this.tNodes.Rows.Add(new object[]{"a市1中心","020101"});
this.tNodes.Rows.Add(new object[]{"a市2中心","020102"});
//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
}

/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region Windows 窗体设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.treeView1 = new System.Windows.Forms.TreeView();
this.button1 = new System.Windows.Forms.Button();
this.SuspendLayout();
// 
// treeView1
// 
this.treeView1.ImageIndex = -1;
this.treeView1.Location = new System.Drawing.Point(16, 16);
this.treeView1.Name = "treeView1";
this.treeView1.SelectedImageIndex = -1;
this.treeView1.Size = new System.Drawing.Size(296, 288);
this.treeView1.TabIndex = 0;
// 
// button1
// 
this.button1.Location = new System.Drawing.Point(328, 176);
this.button1.Name = "button1";
this.button1.TabIndex = 1;
this.button1.Text = "添加节点";
this.button1.Click += new System.EventHandler(this.button1_Click);
// 
// Form4
// 
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(408, 325);
this.Controls.Add(this.button1);
this.Controls.Add(this.treeView1);
this.Name = "Form4";
this.Text = "Form4";
this.ResumeLayout(false);

}
#endregion

/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main() 
{
Application.Run(new Form4());
}

private void AddTopNodes()
{
DataRow[] topNodes = this.tNodes.Select("Len(TypeID)=2");
foreach(DataRow topNode in topNodes)
{
TreeNode topTN = new TreeNode(topNode["ProName"].ToString());
this.treeView1.Nodes.Add(topTN);

DataRow[] childNodes = this.GetChildNodes(topNode["TypeID"].ToString());
foreach(DataRow childNode in childNodes)
{
this.AddChildNodes(topTN,childNode["TypeID"].ToString());
}
}
}

private void AddChildNodes(TreeNode currNode,string childNodeID)
{
TreeNode childTN = new TreeNode(this.GetNodeName(childNodeID));
currNode.Nodes.Add(childTN);

DataRow[] childNodes = this.GetChildNodes(childNodeID);
foreach(DataRow childNode in childNodes)
{
this.AddChildNodes(childTN,childNode["TypeID"].ToString());
}
}

private DataRow[] GetChildNodes(string currTypeID)
{
return this.tNodes.Select("Len(TypeID)="+(currTypeID.Length+2).ToString()+" AND TypeID Like '"+currTypeID+"%'");
}

private string GetNodeName(string nodeID)
{
DataRow pk = this.tNodes.Rows.Find(nodeID);
if(pk!=null)
{
return pk["ProName"].ToString();
}
else
{
return string.Empty;
}
}

private void button1_Click(object sender, System.EventArgs e)
{
this.AddTopNodes();
this.button1.Enabled = false;
}
}
}

#18


关注

#19


唉,好长的代码,帮你顶一下好了。

#20


不好意思,这个还是不太明白。 请说明一下。
private DataRow[] GetChildNodes(string currTypeID)
{
         //*******************************************************
         //获取给出代号节点的所有子节点的行集合
         //即  代号为给出代号长度加2,并且代号 like 'currTypeID%'的节点
         //*******************************************************         
}

#21


lj码真多啊

#22


接着问,在之前我的DataSet是这样做的:DataSet sqlDS = new DataSet();   sqlDOA.Fill(sqlDS,ParnID.ToString()); 现在你的是DataTable 我应该如何改呢?  还有我的判断节点的条件是根据sql语句的查询,而你是在table对象里面的判断,我这里应该怎么做呢? tNodes.Select这里面可以写什么,查询语句????

#23


簡單照Vb的思路,將語法更改!
我就是這樣做得

#24


我的结构是
TypeID  ParnID
36      0
37      0
38      36
39      36
40      36
41      36
42      41
43      36
44      36
45      37
46      37
47      37
48      37
49      37
60      0
61      60
62      60

#25


着急啊!!!

#26


zhongjy001(.) 
代碼都已經實現了

#27


DataSet相当于是一个数据库
Table 是DataSet中的一个表

取Table具体得看你填充DataSet使用的Sql语句,
即sqlDOA.Fill(sqlDS,ParnID.ToString()); 中的ParnID是什么

你把它帖出来看看

#28


zhongjy001(.) 谢谢了。照你的思路我已经做出来了,今后还希望能够多多指教,感谢!!!