写一个方法,遍历一棵树,返回特定的节点(比如.节点的Text等于给定的string)。高手帮忙。仅有得70分

zhouguang0623 2003-08-22 08:59:50
写一个方法,遍历一棵树,返回特定的节点(比如.节点的Text等于给定的string)
Private TreeNode XX节点(TreeView 树,String str)
{
怎么写这个方法。好像用递归。不管怎样,得返回treenode类型。
高手帮忙
}
...全文
186 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhouguang0623 2003-08-25
  • 打赏
  • 举报
回复
xiangzionest(祥子) 你试试你的能调试过去吗
zhouguang0623 2003-08-25
  • 打赏
  • 举报
回复
这倒不重要
我说的是能不能返回节点类型
比如这样private TreeNode Call(TreeNode tn)
而不是 private voidCall(TreeNode tn)
dahuzizyd 2003-08-22
  • 打赏
  • 举报
回复
遍历树的算法:
public void GetAllNodeText(TreeNodeCollection tnc,string txt)
{
foreach (TreeNode node in tnc)
{
if( node.Nodes.Count != 0 )
GetAllNodeText(node.Nodes,txt);
}
}
zhouguang0623 2003-08-22
  • 打赏
  • 举报
回复
各位,能回答就回答,不要到处粘帖子好不好。
诚心向你们请教,谢谢。
xiangzionest 2003-08-22
  • 打赏
  • 举报
回复
private TreeNode GetTreeNode(TreeNodeCollection newNodes,string strFind)
{
TreeNode tempNode=null;
foreach(TreeNode node in newNodes)
{
if(node.text==strFind)
return node;
else
{
tempNode=GetTreeNode(node.Nodes,strFind);
if(tempNode!=Null)
return tempNode;
}
}
}
随手写了一个,没有测试,只是给出递归思路^-^
gujianxin 2003-08-22
  • 打赏
  • 举报
回复
/// <summary>
/// 为给定的节点添加左孩子和右兄弟
/// </summary>
/// <param name="row"></param>
/// <param name="node"></param>
private ExtendTreeNode GetChildAndSibling(DataRow row,TreeNode theNode)
{
ExtendTreeNode node = new ExtendTreeNode();
//是否有左孩子
if(row["LeftChild"] != DBNull.Value)
{
node.leftChild = row["LeftChild"].ToString();
}

//是否有右孩子
if(row["RightSibling"] != DBNull.Value)
{
node.rightSibling = row["RightSibling"].ToString();
}
node.theNode = theNode;
return node;
}

/// <summary>
/// 添加类别
/// </summary>
private void AddSort()
{
TreeNode node = tvw.GetNodeFromIndex(_selectedIdx);
if(node == null)
return;
//是否根节点
bool bIsRoot = _selectedIdx.Equals("0");

string script = "<script language=javascript>OpenWindow('NewSort.aspx?parent=" +
node.NodeData + "&isroot=" + bIsRoot.ToString() + "','null',120,300)</script>";
Page.RegisterClientScriptBlock("newroot",script);
}

private void linkRefresh_Click(object sender, System.EventArgs e)
{
//
}



private void linkAddSort_Click(object sender, System.EventArgs e)
{
AddSort();
}

private void tvw_SelectedIndexChange(object sender, Microsoft.Web.UI.WebControls.TreeViewSelectEventArgs e)
{
_selectedIdx = e.NewNode;
}

/// <summary>
/// 删除选定的节点
/// </summary>
private void Delete()
{

//不能删除根节点
if(_selectedIdx.Equals("0"))
return;
string sql;

SqlCmd cmd = new SqlCmd();
cmd.Open();

//
//删除步骤:
//1、获取要删除的节点delNode
//2、删除节点下所有的子节点
//3、找出要删除节点的前一个兄弟节点preNode
//4、若preNode不存在,将delNode的右兄弟设置为delNode的父节点的左孩子
//5、若preNode存在,将delNode的右兄弟设置为preNdoe的右兄弟
//6、删除delNode

string strSelectedNode = null; //要删除的节点
string strSelectedNodesRightSibling = null; //要删除的节点的右兄弟
string strSelectedNodesPreSibling = null; //要删除的节点的前一个兄弟

//获取要删除的节点和相关的节点
TreeNode selectedNode = tvw.GetNodeFromIndex(_selectedIdx);
strSelectedNode = selectedNode.NodeData;

//删除节点下所有的子节点
DeleteSubNode(selectedNode.Nodes);

//找出要删除节点的前一个兄弟节点preNode
TreeNode parentNode = (TreeNode)selectedNode.Parent;
int nIdx = parentNode.Nodes.IndexOf(selectedNode);
if(0 == nIdx)
{
//若preNode不存在,将delNode的右兄弟设置为delNode的父节点的左孩子
bool bIsRoot = parentNode.Parent.GetType() == tvw.GetType();
if(parentNode.Nodes.Count > nIdx + 1)
{

strSelectedNodesRightSibling = parentNode.Nodes[nIdx+1].NodeData;
if(bIsRoot)
{
sql = "update ResStock set firstnode ='" +
strSelectedNodesRightSibling + "' where " +
"stockid ='" + parentNode.NodeData + "'";
}
else
{
sql = "update ResSort set leftchild ='" +
strSelectedNodesRightSibling + "' where " +
"sortid ='" + parentNode.NodeData + "'";
}
}
else
{
if(bIsRoot)
{
sql = "update ResStock set firstnode =null where " +
"stockid ='" + parentNode.NodeData + "'";
}
else
{
sql = "update ResSort set leftchild =null where " +
"sortid ='" + parentNode.NodeData + "'";
}
}
}
else
{
//若preNode存在,将delNode的右兄弟设置为preNdoe的右兄弟
nIdx--;

strSelectedNodesPreSibling = parentNode.Nodes[nIdx].NodeData;

//找出右兄弟
if(parentNode.Nodes.Count > nIdx + 2)
strSelectedNodesRightSibling = parentNode.Nodes[nIdx+2].NodeData;

if(null != strSelectedNodesRightSibling)
{
sql = "update ResSort set rightsibling = '" +
strSelectedNodesRightSibling + "' where " +
"sortid = '" + strSelectedNodesPreSibling + "'";
}
else
{
sql = "update ResSort set rightsibling = null where " +
"sortid = '" + strSelectedNodesPreSibling + "'";
}
}
if(cmd.ExecNonQuery(sql))
{
//删除delNode
sql = "delete from ResSort where sortid='" +
strSelectedNode + "'";
cmd.ExecNonQuery(sql);
}
cmd.Close();

}

/// <summary>
/// 删除子节点
/// </summary>
private void DeleteSubNode(TreeNodeCollection tnc)
{
foreach(TreeNode node in tnc)
{
if(node.Nodes.Count != 0)
DeleteSubNode(node.Nodes);
string sql = "update ResFiles set sortid=null where " +
"sortid ='" + node.NodeData + "'";
SqlCmd cmd = new SqlCmd();
cmd.Open();
if(cmd.ExecNonQuery(sql))
{
sql = "delete from ResSort where sortid='" +
node.NodeData + "'";
cmd.ExecNonQuery(sql);
}
cmd.Close();
}
}

private void linkDel_Click(object sender, System.EventArgs e)
{
Delete();
Refresh();
}

private void Refresh()
{
string script = "<script language=javascript>" +
"_Refresh();</script>";
Page.RegisterClientScriptBlock("refresh",script);
}

}
public class ExtendTreeNode
{
public string leftChild = null;
public string rightSibling = null;
public TreeNode theNode = null;
public object Value;
public ExtendTreeNode()
{
}

}
gujianxin 2003-08-22
  • 打赏
  • 举报
回复
/// <summary>
/// SortList 的摘要说明。
/// </summary>
public class SortList : System.Web.UI.Page
{
private const string Stock_Image_Url = "../images/MediaStock.gif";
private const string Sort_Image_Url = "../images/MediaSort.gif";

private string _selectedIdx = "0";

protected System.Web.UI.WebControls.LinkButton linkRefresh;
protected System.Web.UI.WebControls.LinkButton linkAddSort;
protected System.Web.UI.WebControls.LinkButton linkDel;

protected Microsoft.Web.UI.WebControls.TreeView tvw;

private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面

this.CreateMedaiTreeView();
}

#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN:该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}

/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.tvw.SelectedIndexChange += new Microsoft.Web.UI.WebControls.SelectEventHandler(this.tvw_SelectedIndexChange);
this.linkDel.Click += new System.EventHandler(this.linkDel_Click);
this.linkRefresh.Click += new System.EventHandler(this.linkRefresh_Click);
this.linkAddSort.Click += new System.EventHandler(this.linkAddSort_Click);
this.Load += new System.EventHandler(this.Page_Load);

}
#endregion

private void CreateMedaiTreeView()
{
tvw.Nodes.Clear();
string sql = "SELECT top 1 * FROM ResStock";
SqlConnection cnn = new SqlConnection(ConnectionInfo.ConnectionString);
cnn.Open();
SqlDataAdapter sqlDA = new SqlDataAdapter(sql,cnn);
DataSet ds = new DataSet();
sqlDA.Fill(ds,"Stock");
sqlDA.SelectCommand.CommandText = "SELECT * FROM ResSort";
sqlDA.Fill(ds,"Sort");
cnn.Close();

//添加主键
DataColumn primaryKey = ds.Tables["Sort"].Columns["SortID"];
ds.Tables["Sort"].PrimaryKey = new DataColumn[]{primaryKey};

TreeNode node = GetRootNode(ds.Tables["Stock"],ds.Tables["Sort"]);
if(node != null)
tvw.Nodes.Add(node);
//展开
node.Expanded = true;
}
/// <summary>
/// 创建并返回第一个节点
/// </summary>
/// <param name="dtStock">媒体库或资源库等的库表</param>
/// <param name="dtSort">类别表</param>
/// <returns>返回一node,将其添加到TreeView控件既可</returns>
private TreeNode GetRootNode(DataTable dtStock, DataTable dtSort)
{
//调用函数前必须检查是否有记录
if(dtStock.Rows.Count > 0)
{

TreeNode stockNode = new TreeNode();
stockNode.Text = dtStock.Rows[0]["StockName"].ToString();
stockNode.ImageUrl = Stock_Image_Url;
stockNode.NodeData = dtStock.Rows[0]["StockID"].ToString();
stockNode.NavigateUrl = "RezFileList.aspx";
stockNode.Target = "main";

//找出第一个左孩子
if(dtStock.Rows[0]["FirstNode"] == DBNull.Value)
return stockNode;

string szFirstNode = dtStock.Rows[0]["FirstNode"].ToString();
DataRow firstRow = dtSort.Rows.Find(new Guid(szFirstNode));

//第一个左孩子是否存在
if(null == firstRow)
return stockNode;

TreeNode firstNode = new TreeNode();
//===========================================
//请在这里手工添加Node的各项属性
//===========================================
firstNode.Text = firstRow["SortName"].ToString();
firstNode.ImageUrl = Sort_Image_Url;
firstNode.NodeData = firstRow["SortID"].ToString();
firstNode.NavigateUrl = "RezFileList.aspx?sortid=" + firstNode.NodeData;
firstNode.Expanded = true;
firstNode.Target = "main";
//===========================================
//添加结束
//===========================================

//将第一个节点添加到根节点
stockNode.Nodes.Add(firstNode);

//将第一个节点压入堆栈
Stack stack = new Stack();
stack.Push(GetChildAndSibling(firstRow,firstNode));

while(stack.Count > 0)
{
ExtendTreeNode node = (ExtendTreeNode)stack.Pop();
DataRow row;
//寻找左孩子
if(node.leftChild != null)
{
row = dtSort.Rows.Find(new Guid(node.leftChild));
if(null != row)
{
TreeNode leftChild = new TreeNode();
//===========================================
//请在这里手工添加Node的各项属性
//===========================================
//Exsample:
leftChild.Text = row["SortName"].ToString();
leftChild.ImageUrl = Sort_Image_Url;
leftChild.NodeData = row["SortID"].ToString();
leftChild.NavigateUrl = "RezFileList.aspx?sortid=" +
leftChild.NodeData;
leftChild.Expanded = true;
leftChild.Target = "main";
//===========================================
//添加结束
//===========================================

//添加到父节点
node.theNode.Nodes.Add(leftChild);
//将新的节点压入堆栈
stack.Push(GetChildAndSibling(row,leftChild));
}
}
//寻找右兄弟
if(node.rightSibling != null)
{
row = dtSort.Rows.Find(new Guid(node.rightSibling));
if(null != row)
{
TreeNode rightSibling = new TreeNode();
//===========================================
//请在这里手工添加Node的各项属性
//===========================================
//Exsample:
rightSibling.Text = row["SortName"].ToString();
rightSibling.ImageUrl = Sort_Image_Url;
rightSibling.NodeData = row["SortID"].ToString();
rightSibling.NavigateUrl = "RezFileList.aspx?sortid=" +
rightSibling.NodeData;
rightSibling.Expanded = true;
rightSibling.Target = "main";
//===========================================
//添加结束
//===========================================

//添加到父节点
((TreeNode)node.theNode.Parent).Nodes.Add(rightSibling);
//将新的节点压入堆栈
stack.Push(GetChildAndSibling(row,rightSibling));
}
}
}

return stockNode;

}
else
return null;

}
zhouguang0623 2003-08-22
  • 打赏
  • 举报
回复
能直接给出方法吗
rqxiang 2003-08-22
  • 打赏
  • 举报
回复
TreeView使用笔记


TreeView由节点构成,建树通过对TreeView.items属性进行操作。Items是一个TTreeNodes对象,
这是一个TTreeNode集。


一、针对TTreeNodes,也就是 TreeView.Items,有这些属性:

1、count,节点个数。

2、item[index] ,通过index得到节点。


二、针对TTreeNodes,也就是 TreeView.Items,常用的添加节点的操作有:

AddFirst添加第一个根节点。由此函数添加的节点总排在前面,除非后来又使用此函数添加了一个节点,
则后添加的节点将排在前面。该函数返回新添加的节点。

AddChildFirst添加第一个子节点,要求有父节点作为其参数。返回新添加的节点。

AddChild添加一个子节点,要求有父节点作为其参数。返回新添加的节点。

Add添加一个兄弟节点,要求有兄弟节点作为其参数。返回新添加的节点。


三、针对TTreeNodes,也就是 TreeView.Items,常用的得到节点的操作有:

GetFirstNode() 得到根节点。

然后配合TTreeNode.GetNext(),就可以访问所有的节点。


四、建树举例:


var

root_node,cur_node:TTreeNode;

begin

root_node:=AddFirst(nil,'根节点1');

cur_node:=addChildfirst(root_node,nil,'根节点1_child1');

add(cur_node,'根节点1_child2');

root_node:=Add(nil,'根节点2');

AddChildFirst(root_node,''根节点2_child1');

end;





五、事件触发:

当从一个节点跳到另一个节点,会触发TTreeView.OnChange事件。该事件中,将传递node,即当前被选中的
节点。


当修改一个节点的text时,会触发TTreeView.onEdit事件。



六、将节点和节点所对应的数据联系起来

对于每个TTreeNode,有个Data属性,可以存放一个指针。我们可以利用这个域来存放与节点对应的自己的数据。

1.我们先定义一个数据结构,作为记录我们要记录的数据。如:

type

PMyData=^TMyData;

TMyData=Record

sFName:string;

sLName:String;

nIndex:integer;

end;


2.然后,创建数时,将节点和节点数据联系起来:

procedure TForm1.Button1Click(Sender: TObject);

var

myshuju: PMyData

cur_node:TTreeNode;

begin

New(MyRecPtr); //记住,一定要先分配内存。有几个节点,就要分配几次内存。

myshuju^.FName:=Edit1.Text;

Myshuju^.LName := Edit2.Text;

TreeViewIndex := StrToInt(Edit3.Text);

with TreeView1 do

begin

cur_node:=items.AddFirst(nil,'first');

cur_node.data:=myshuju;

end;

end;


3.当我们选中一个节点时,就可以使用我们的数据了。

procedure TForm1.TreeView1Change(Sender:TObject;Node:TTreeNode);

begin

if node.data<>nil then

self.label1.caption:=pmyData(node.data)^.Fname+pmyData(node.data)^.Lname

end;



七、一般使用流程:

1、添加全局变量:

b_first:boolean; //记录是否是第一次访问节点,因为此时数据还未准备好,而一旦访问节点就会触
发OnChange事件,在此事件处理函数中也许会出错。

2、在FormCreate中,

a、设置b_first:=true;

b. 创建数并将节点与数据联系。

3、在FormShow中

设置b_first:=false;

4.在事件OnChange中处理节点被选中事件。

5.在Edit中处理节点被修改Text事件。

并调用OnChange.

6.在 TreeView.Destory中

释放Data 中指向的内存空间。
CSTerry 2003-08-22
  • 打赏
  • 举报
回复
没看没看清楚题目……我写的这个是选中特定的节点,不过也差不多,你改一下就可以了
CSTerry 2003-08-22
  • 打赏
  • 举报
回复
eazy 啦

foreach (TreeNode tn in treeView1.Nodes)
{
Call(tn);
}

private void Call(TreeNode tn)
{
if(tn.Text="youstring")
{
tn.Checked=true;
}
foreach (TreeNode newtn in tn.Nodes)//递归
{
Call(newtn);
}
}
xiangzionest 2003-08-22
  • 打赏
  • 举报
回复
我的不行吗?
zhouguang0623 2003-08-22
  • 打赏
  • 举报
回复
谁能给出具体的。不要思想
xamcsdn2 2003-08-22
  • 打赏
  • 举报
回复
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace WindowsApplication26
{
/// <summary>
/// Form1 的摘要说明。
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.TreeView treeView1;
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null;
private bool cFlag=true;
public Form1()
{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();

//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
}

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

#region Windows Form Designer generated code
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.treeView1 = new System.Windows.Forms.TreeView();
this.SuspendLayout();
//
// treeView1
//
this.treeView1.Anchor = (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right);
this.treeView1.CheckBoxes = true;
this.treeView1.ImageIndex = -1;
this.treeView1.Location = new System.Drawing.Point(0, 67);
this.treeView1.Name = "treeView1";
this.treeView1.Nodes.AddRange(new System.Windows.Forms.TreeNode[] {
new System.Windows.Forms.TreeNode("节点0"),
new System.Windows.Forms.TreeNode("节点1", new System.Windows.Forms.TreeNode[] {
new System.Windows.Forms.TreeNode("节点6"),
new System.Windows.Forms.TreeNode("节点7", new System.Windows.Forms.TreeNode[] {
new System.Windows.Forms.TreeNode("节点13")}),
new System.Windows.Forms.TreeNode("节点8", new System.Windows.Forms.TreeNode[] {
new System.Windows.Forms.TreeNode("节点14")}),
new System.Windows.Forms.TreeNode("节点9")}),
new System.Windows.Forms.TreeNode("节点2", new System.Windows.Forms.TreeNode[] {
new System.Windows.Forms.TreeNode("节点10", new System.Windows.Forms.TreeNode[] {
new System.Windows.Forms.TreeNode("节点11"),
new System.Windows.Forms.TreeNode("节点12")})}),
new System.Windows.Forms.TreeNode("节点3"),
new System.Windows.Forms.TreeNode("节点4"),
new System.Windows.Forms.TreeNode("节点5")});
this.treeView1.SelectedImageIndex = -1;
this.treeView1.Size = new System.Drawing.Size(488, 256);
this.treeView1.TabIndex = 0;
this.treeView1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.treeView1_MouseDown);
this.treeView1.Click += new System.EventHandler(this.treeView1_Click);
this.treeView1.AfterCheck += new System.Windows.Forms.TreeViewEventHandler(this.treeView1_AfterCheck);
this.treeView1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.treeView1_MouseUp);
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(488, 325);
this.Controls.AddRange(new System.Windows.Forms.Control[] {
this.treeView1});
this.Name = "Form1";
this.Text = "Form1";
this.Load += new System.EventHandler(this.Form1_Load);
this.ResumeLayout(false);

}
#endregion

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

private void Form1_Load(object sender, System.EventArgs e)
{

}
public void setChildNote(TreeNodeCollection tnd,bool chkFlag)
{
foreach (TreeNode xx in tnd )
{
xx.Checked=chkFlag;
// xx.Checked=true;
}
}

private void treeView1_AfterCheck(object sender, System.Windows.Forms.TreeViewEventArgs e)
{

setChildNote(e.Node.Nodes, cFlag);
}

private void treeView1_Click(object sender, System.EventArgs e)
{

}

private void treeView1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{


}

private void treeView1_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
{
Point pt = new Point(e.X,e.Y);

this.cFlag =!this.treeView1.GetNodeAt(pt).Checked;
}

}
}

110,499

社区成员

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

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

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