TreeView 树节点添加,删除的操作方法(递归调用显示子树)
1、加载树节点的方法(无级限)
/// <summary>
/// 加载树节点。建树的基本思路是:从根节点开始递归调用显示子树。
/// </summary>
/// <param name="dt">是DataTable类型的保存树节点的数据表</param>
/// <param name="nodeID">数据表中保存节点的列名称</param>
/// <param name="parentID">数据表中保存节点父节点的列名称</param>
/// <param name="nodeName">数据表中保存节点名称的列名称</param>
/// <param name="treeNodeCollection">表示TreeView.Nodes对象的集合</param>
/// <param name="rootNodeTag">定义根节点的父节点的标记</param>
//法一:用DataView
public static void InitTree(DataTable dt,string
nodeID,string parentID,string nodeName,TreeNodeCollection
treeNodeCollection,string rootNodeTag)
{
try
{
TreeNode tmpNode;
DataView dv=new DataView();
dv.Table=dt;
if (rootNodeTag!=""||rootNodeTag!=null)
dv.RowFilter=parentID+"='"+rootNodeTag+"'";
foreach(DataRowView drv in dv)
{
tmpNode=new TreeNode();
tmpNode.Text=drv[nodeName].ToString();
tmpNode.Tag=drv[nodeID];
string father=drv[nodeID].ToString();
treeNodeCollection.Add(tmpNode);
InitTree(dt,nodeID,parentID,nodeName,tmpNode.Nodes,father);
}
}
catch(Exception te)
{
MessageBox.Show(te.Message,"Error",MessageBoxButtons.OK,MessageBoxIcon.Warning);
}
}
注意:以下为弹出菜单项代码及相关的函数和方法
2、增加根节点
private void menuItemAddRoot_Click(object sender, System.EventArgs e)
{
try
{
TreeNode treeNode=new TreeNode("新节点");
treeNode.Tag=MaxRecordNumber(dataSet.Tables["tree"],"NodeID")+1;
this.treeView.Nodes.Add(treeNode);
AddDeleteNode(treeNode,RootNodeTag,"Add");
treeView.SelectedNode = treeNode ;
LoadTreeView.LoadTreeNodeImage(treeView.SelectedNode,this.imageList1,NodeImageMode);
//执行指定节点的选定操作
this.treeViewAfterSelect(treeView.SelectedNode );
menuItemRename_Click(new object(),new System.EventArgs());
}
catch(Exception te)
{
MessageBox.Show(this,te.Message,"ErrorRoot",MessageBoxButtons.OK,MessageBoxIcon.Warning);
}
}
3、增加子节点
private void menuItemAddChild_Click(object sender, System.EventArgs e)
{
try
{
//1.当一个节点有对应链接资料时,不可以增加子节点
//2.当一个节点有对应链接资料时,可以增加图片
if (this.IsHaveLineData(dataSet.Tables["data"],this.richTextBoxId))
{
MessageBox.Show(this,"要增加子节点,必须在这个节点没有可以链接的资料后才可以增加!","操作错误",MessageBoxButtons.OK,MessageBoxIcon.Information );
return;
}
TreeNode treeNode=new TreeNode("新节点");
treeNode.Tag=MaxRecordNumber(dataSet.Tables["tree"],"NodeID")+1;
treeView.SelectedNode.Nodes.Add(treeNode);
AddDeleteNode(treeNode,treeView.SelectedNode.Tag.ToString(),"Add");
treeView.SelectedNode = treeNode ;
LoadTreeView.LoadTreeNodeImage(treeView.SelectedNode,this.imageList1,NodeImageMode);
//执行指定节点的选定操作
this.treeViewAfterSelect(treeView.SelectedNode );
menuItemRename_Click(new object(),new System.EventArgs());
}
catch(Exception te)
{
MessageBox.Show(this,te.Message,"ErrorChild",MessageBoxButtons.OK,MessageBoxIcon.Warning);
}
}
4、增加兄弟节点
private void menuItemAddBorther_Click(object sender, System.EventArgs e)
{
try
{
//判断是否选定组件中的根节点
if (treeView.SelectedNode.Parent==null)
{
MessageBox.Show ("节点<"+treeView.SelectedNode.Text.Trim()+
">为根节点,要加入兄弟节点,请使用\"加入根节点\"选项!" , "Information" ,
MessageBoxButtons.OK , MessageBoxIcon.Information ) ;
return;
}
TreeNode treeNode=new TreeNode("新节点");
treeNode.Tag=MaxRecordNumber(dataSet.Tables["tree"],"NodeID")+1;
treeView.SelectedNode.Parent.Nodes.Add(treeNode);
AddDeleteNode(treeNode,treeView.SelectedNode.Parent.Tag.ToString().Trim(),"Add");
treeView.SelectedNode = treeNode ;
LoadTreeView.LoadTreeNodeImage(treeView.SelectedNode,this.imageList1,NodeImageMode);
//执行指定节点的选定操作
this.treeViewAfterSelect(treeView.SelectedNode );
menuItemRename_Click(new object(),new System.EventArgs());
}
catch(Exception te)
{
MessageBox.Show(this,te.Message,"ErrorParent",MessageBoxButtons.OK,MessageBoxIcon.Warning);
}
}
5、刪除节点
private void menuItemDelete_Click(object sender, System.EventArgs e)
{
try
{
if(MessageBox.Show(this,"删除节点《"+treeView.SelectedNode.Text.Trim()+"》,与其对
应的信息也将被删除,你确定要删除
吗?","Information",MessageBoxButtons.OKCancel,MessageBoxIcon.Question)==DialogResult.OK)
{
//判断选定的节点是否存在下一级节点
if ( treeView.SelectedNode.Nodes.Count == 0 )
{
//删除节点
TreeNode deleNode=treeView.SelectedNode;
if (File.Exists(this.richTextBoxPictureName)) File.Delete(this.richTextBoxPictureName);
int rows=myBindTree.Position;
treeView.Nodes.Remove(deleNode);
dataSet.Tables["tree"].Rows[rows].Delete();
}
else
MessageBox.Show ( "请先删除此节点中的子节点!" , "Information" ,
MessageBoxButtons.OK , MessageBoxIcon.Information ) ;
}
}
catch(Exception te)
{
MessageBox.Show(this,te.Message,"ErrorDelete",MessageBoxButtons.OK,MessageBoxIcon.Warning);
}
}
6、节点重命名
private void menuItemRename_Click(object sender, System.EventArgs e)
{
TreeNode mySelectedNode=treeView.SelectedNode;
if (mySelectedNode!=null)
{
treeView.SelectedNode=mySelectedNode;
treeView.LabelEdit=true;
mySelectedNode.BeginEdit();
}
else
MessageBox.Show("No tree node selected .\n","Invalid selection");
}
/// <summary>
/// 返回指定表的最大NodeID号码,也就是当前选定节点的tag
/// </summary>
/// <param name="dt">数据表</param>
/// <param name="columnName">数据列</param>
/// <returns>最大NodeID号码</returns>
private int MaxRecordNumber(DataTable dt,string columnName)
{
int number=0;
DataView dv=dt.DefaultView;
dv.Sort=columnName+" ASC";//一个字符串,它包含列名,后跟“ASC”(升序)或“DESC”(降序)。在默认情况下,列按升序排列。多个列可用逗号隔开。
foreach(DataRow dr in dt.Rows)
{
number=Convert.ToInt16(dr[columnName].ToString().Trim())>number?Convert.ToInt16(dr[columnName].ToString().Trim()):number;
}
return number;
}
/// <summary>
/// 在数据表中增加节点或删除节点
/// </summary>
/// <param name="addDeleteNode">要增加或删除的节点</param>
/// <param name="parentNodeId">要增加或删除节点的父节点</param>
/// <param name="AddDeleteTag">增删节点标志(add为增加节点,delete为删除节点,不区分大小写)</param>
private void AddDeleteNode(TreeNode addDeleteNode,string parentNodeId,string AddDeleteTag)
{
try
{
if(AddDeleteTag.ToUpper()=="ADD")
{
object key=parentNodeId;
DataRow dr=dataSet.Tables["tree"].Rows.Find(key);
DataRow drNew=dataSet.Tables["tree"].NewRow();
if(dr!=null)
{
drNew["ParentID"]=dr["NodeID"];
}
else
{
drNew["ParentID"]=RootNodeTag;
}
drNew["NodeID"]=(int)addDeleteNode.Tag;
drNew["NodeName"]=addDeleteNode.Text.Trim();
dataSet.Tables["tree"].Rows.Add(drNew);
}
else
{
if(AddDeleteTag.ToUpper()=="DELETE")
{
dataSet.Tables["tree"].Rows[myBindTree.Position].Delete();
}
}
}
catch(Exception te)
{
MessageBox.Show(this,te.Message,"Error",MessageBoxButtons.OK,MessageBoxIcon.Warning);
}
}
分享到:
相关推荐
### C# TreeNode 控件使用详解 #### 一、概述 在C#的Windows Forms或Web Forms应用程序开发过程中,经常会遇到需要展示层次结构数据的情况。这时,`TreeNode`控件便显得尤为重要。`TreeNode`控件是`TreeView`控件...
C# 树结构目录自定义控件,可以勾选单个、多个,可以添加、删除root,child,有滚动条 详情请看我的文章介绍,有图片展示 :https://blog.csdn.net/m0_65636467/article/details/132711246
TreeNode ,左侧面板显示三级目录, int sublen = taskht.Keys.Count;//三级目录长度 int len = webht.Keys.Count; //二级目录长度 System.Windows.Forms.TreeNode treeRootNode = new System.Windows.Forms....
在C#编程中,`TreeView`控件是一个常用的可视化组件,用于展示层次结构的数据。它在用户界面中呈现为一个树形结构,其中每个节点代表一个数据项。本篇文章将详细探讨如何实现C# `TreeView`控件的右键菜单功能,包括...
本篇文章将详细讲解如何在C#中使用递归方法为`TreeView`添加子节点,特别是在处理文件夹结构时。递归是一种强大的编程技术,它允许函数调用自身来解决问题,特别适合处理具有层级关系的数据。 首先,我们需要理解`...
在C#编程中,`TreeView`控件是一个常用的UI元素,用于展示层次化的数据结构,如文件系统目录、组织结构等。默认情况下,`TreeView`控件的样式和外观是受操作系统主题控制的,但有时我们需要自定义其边框样式以满足...
总结起来,通过自定义`TreeNode`和`TreeView`控件,我们可以为C# WinForm的`TreeView`节点添加按钮,从而增加用户交互性和功能。这为用户提供了一种直观的方式来触发与特定节点相关的操作。在实际应用中,你可以根据...
一个WinForm的TreeView,某node的CheckBox初始状态为false,当双击这个node的checkbox时,会出现很奇怪的情况: 第一次双击checkbox,checkbox显示的状态会切换两次状态,unchecked-> checked-> unchecked,而...
在本文中,我们将深入探讨如何在C#编程环境中利用TreeView控件进行单选框操作,特别是在Windows Forms或WPF应用程序中。TreeView控件是展示层级结构数据的强大工具,而单选框的添加则能增强用户交互性。我们将讨论三...
在IT行业中,数据的存储和交换格式有很多种,其中JSON(JavaScript Object Notation)因其轻量级、易读易写的特点,被广泛应用于网络数据传输和本地数据存储。本项目主要涉及的是将“树形结构文件”转换为JSON格式,...
### ctree树的展开与折叠知识点详解 #### 一、ctree简介 在软件开发领域,特别是涉及到数据结构展示的应用程序中,`ctree`(通常指基于MFC的树控件)是一种非常实用的工具,它可以帮助开发者构建出直观且易于操作的...
在上述代码中,我们首先检查`TreeNode`的状态。如果节点被选中,我们就使用自定义的颜色和字体来绘制文本,这里用的是深蓝色背景和白色文字。如果节点未被选中,我们设置`e.DrawDefault = true;`,让系统使用默认的...
C#实现树型结构TreeView节点拖拽的简单功能 在软件开发中,一个树形结构的数据若不支持拖拽功能,那么使用起来就会很糟糕,用户体验也不会太好。因此,在组织机构管理模块中实现树型结构TreeView节点拖拽的简单功能...
本主题将深入探讨如何在C#编程环境中使用`TreeNode`来处理树形结构,并结合`zip`文件格式进行详细讲解。 `TreeNode`是.NET Framework中的一个类,位于`System.Windows.Forms`命名空间下,它是`TreeView`控件的基础...
这可以通过遍历`TreeNode.Nodes`集合并为每个子节点调用`OnPaint`实现。 5. **优化性能**: 虽然自定义绘制提供了极大的灵活性,但也可能影响性能。确保只在必要时(如节点改变、控件大小变化等)才重绘,可以使用...
在C#中,你可以使用ADO.NET或者Entity Framework与SQL Server交互,通过SQL查询获取树形数据,并将其映射为`TreeNode`对象。例如,你可以使用递归查询来获取具有层级关系的数据库对象。 总的来说,C#中对树节点的...
在C#编程中,`TreeView`控件是一个常用的可视化组件,用于展示层次结构的数据,比如文件系统、数据库结构等。本教程将详细讲解如何在C#中实现`TreeView`控件的序列化和反序列化,这对于数据持久化和用户界面状态的...
在C#编程中,`TreeView`控件是一个常用的可视化组件,用于展示数据的层次结构,如文件系统、组织结构或数据库。在这个特定的资源中,作者分享了如何在C#中实现获取`TreeView`控件的子节点的方法。下面将详细讲解`...
在C#编程中,树型结构是一种非常常见且重要的数据结构,它被广泛应用于各种场景,如文件系统、组织架构、数据库索引等。本文将深入探讨如何在C#中实现一个树型结构分类统计表格的通用解决方案。 首先,我们需要理解...
在C# WinForm应用开发中,`TreeView`控件常被用来展示文件系统或自定义层次结构的数据。本文将深入探讨如何使用C#实现`TreeView`控件来递归加载文件夹及其子文件夹的内容。 首先,理解`TreeView`控件。`TreeView`...