`

C# TreeNode

 
阅读更多
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# TreeNode 控件使用详解 #### 一、概述 在C#的Windows Forms或Web Forms应用程序开发过程中,经常会遇到需要展示层次结构数据的情况。这时,`TreeNode`控件便显得尤为重要。`TreeNode`控件是`TreeView`控件...

    C# 树结构目录自定义控件,可以勾选单个、多个,可以添加、删除root,child,有滚动条

    C# 树结构目录自定义控件,可以勾选单个、多个,可以添加、删除root,child,有滚动条 详情请看我的文章介绍,有图片展示 :https://blog.csdn.net/m0_65636467/article/details/132711246

    TreeNode多级目录显示

    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递归添加子节点

    本篇文章将详细讲解如何在C#中使用递归方法为`TreeView`添加子节点,特别是在处理文件夹结构时。递归是一种强大的编程技术,它允许函数调用自身来解决问题,特别适合处理具有层级关系的数据。 首先,我们需要理解`...

    C# TreeView重绘边框

    在C#编程中,`TreeView`控件是一个常用的UI元素,用于展示层次化的数据结构,如文件系统目录、组织结构等。默认情况下,`TreeView`控件的样式和外观是受操作系统主题控制的,但有时我们需要自定义其边框样式以满足...

    自定义TreeView,在树节点旁添加按钮。

    总结起来,通过自定义`TreeNode`和`TreeView`控件,我们可以为C# WinForm的`TreeView`节点添加按钮,从而增加用户交互性和功能。这为用户提供了一种直观的方式来触发与特定节点相关的操作。在实际应用中,你可以根据...

    C# 解决双击TreeView表里checkbox本身Bug问题

    一个WinForm的TreeView,某node的CheckBox初始状态为false,当双击这个node的checkbox时,会出现很奇怪的情况: 第一次双击checkbox,checkbox显示的状态会切换两次状态,unchecked-&gt; checked-&gt; unchecked,而...

    treeview关于单选框的操作[推荐]

    在本文中,我们将深入探讨如何在C#编程环境中利用TreeView控件进行单选框操作,特别是在Windows Forms或WPF应用程序中。TreeView控件是展示层级结构数据的强大工具,而单选框的添加则能增强用户交互性。我们将讨论三...

    树形结构文件转Json格式

    在IT行业中,数据的存储和交换格式有很多种,其中JSON(JavaScript Object Notation)因其轻量级、易读易写的特点,被广泛应用于网络数据传输和本地数据存储。本项目主要涉及的是将“树形结构文件”转换为JSON格式,...

    ctree树的展开和折叠

    ### ctree树的展开与折叠知识点详解 #### 一、ctree简介 在软件开发领域,特别是涉及到数据结构展示的应用程序中,`ctree`(通常指基于MFC的树控件)是一种非常实用的工具,它可以帮助开发者构建出直观且易于操作的...

    C#中TreeView节点的自定义绘制方法

    在上述代码中,我们首先检查`TreeNode`的状态。如果节点被选中,我们就使用自定义的颜色和字体来绘制文本,这里用的是深蓝色背景和白色文字。如果节点未被选中,我们设置`e.DrawDefault = true;`,让系统使用默认的...

    C#实现树型结构TreeView节点拖拽的简单功能,附全部源码,供有需要的参考

    C#实现树型结构TreeView节点拖拽的简单功能 在软件开发中,一个树形结构的数据若不支持拖拽功能,那么使用起来就会很糟糕,用户体验也不会太好。因此,在组织机构管理模块中实现树型结构TreeView节点拖拽的简单功能...

    howto_treenode_orientations_C#_zip_源码

    本主题将深入探讨如何在C#编程环境中使用`TreeNode`来处理树形结构,并结合`zip`文件格式进行详细讲解。 `TreeNode`是.NET Framework中的一个类,位于`System.Windows.Forms`命名空间下,它是`TreeView`控件的基础...

    vs2010 C# 自己画 TreeView的Node(可以画颜色的哦)

    这可以通过遍历`TreeNode.Nodes`集合并为每个子节点调用`OnPaint`实现。 5. **优化性能**: 虽然自定义绘制提供了极大的灵活性,但也可能影响性能。确保只在必要时(如节点改变、控件大小变化等)才重绘,可以使用...

    C#树节点的直接修改

    在C#中,你可以使用ADO.NET或者Entity Framework与SQL Server交互,通过SQL查询获取树形数据,并将其映射为`TreeNode`对象。例如,你可以使用递归查询来获取具有层级关系的数据库对象。 总的来说,C#中对树节点的...

    C#的控件使用:树形图TreeView如何实现序列化和反序列化.rar

    在C#编程中,`TreeView`控件是一个常用的可视化组件,用于展示层次结构的数据,比如文件系统、数据库结构等。本教程将详细讲解如何在C#中实现`TreeView`控件的序列化和反序列化,这对于数据持久化和用户界面状态的...

    c# treeview 获取子节点

    在C#编程中,`TreeView`控件是一个常用的可视化组件,用于展示数据的层次结构,如文件系统、组织结构或数据库。在这个特定的资源中,作者分享了如何在C#中实现获取`TreeView`控件的子节点的方法。下面将详细讲解`...

    C#树型结构分类统计表格一般性解决方案

    在C#编程中,树型结构是一种非常常见且重要的数据结构,它被广泛应用于各种场景,如文件系统、组织架构、数据库索引等。本文将深入探讨如何在C#中实现一个树型结构分类统计表格的通用解决方案。 首先,我们需要理解...

    C# winform TreeView递归文件夹

    在C# WinForm应用开发中,`TreeView`控件常被用来展示文件系统或自定义层次结构的数据。本文将深入探讨如何使用C#实现`TreeView`控件来递归加载文件夹及其子文件夹的内容。 首先,理解`TreeView`控件。`TreeView`...

Global site tag (gtag.js) - Google Analytics