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#.NetTreeNode控件的使用详解,在开发应用程序时需要用到,很有用的。
TreeNode ,左侧面板显示三级目录, int sublen = taskht.Keys.Count;//三级目录长度 int len = webht.Keys.Count; //二级目录长度 System.Windows.Forms.TreeNode treeRootNode = new System.Windows.Forms....
C#Tree View右键菜单,树节点编辑,增加节点,删除节点,复制粘贴节点
实现TreeView TreeNode递归添加文件夹 可以的话 给我好评论 谢谢啦
C# TreeView重绘边框源码
C# 树结构目录自定义控件,可以勾选单个、多个,可以添加、删除root,child,有滚动条 详情请看我的文章介绍,有图片展示 :https://blog.csdn.net/m0_65636467/article/details/132711246
基于C# winform,写的一个自定义TreeView和TreeNode,可以在每个自定义节点旁添加按钮。
因工作需要制作的,把树形结构文件转Json格式使用,目前自测没有问题,若是大家用着有什么问题可以反馈给我,谢谢。
treenode orientations
vs2010上自己画Treeview的节点,画的时候可以自己设置颜色。
TreeView和TreeNode控件常用功能,值得收藏,希望对你有所帮帮。
C#422-研究生管理信息系统,OleDbDataReader rd; string sql; sql="select MName from majorinfo"; oleCommand1.CommandText=sql; oleConnection1.Open(); rd=oleCommand1.ExecuteReader(); ...
C#关于xml文件和TreeView之间的转换解析,XML格式文件转TreeView,TreeNode、
C#数据结构树的查询实例源码TreeView空间的应用实例源码 foreach (TreeNode node1 in this.treeView1.Nodes[i].Nodes) { if (node1.Text == textBox2.Text.Trim()) { treeView1.SelectedNode = node1; ...
TreeNode o=new TreeNode(k); INISegment s=inf.Segments[k]; //取出当前配置节 foreach(string k1 in s.Items.Keys) { TreeNode o1=new TreeNode(k1+" = "+s.Items[k1].Value); //访问配置节中每个配置项 o....
c#winform菜单树使用背景图.zip 用的时候把图片地址换下 直接可以使用 非常好用的c#winform菜单树使用背景图
《C#全能速查宝典》共分为8章,分别介绍了C#语言基础、Windows窗体及常用控件、Windows高级控件、控件公共属性、方法及事件、数据库开发、文件、数据流与注册表、GDI+绘图技术和C#高级编程,共包含562个C#编程中常用...
C#学生信息显示 namespace xuexi6._ { public partial class Form1 : Form { public Form1() { InitializeComponent(); } public student[] sts = new student[10]; private void initializestudent() { ...
TreeNode Node = new TreeNode(); if (pNode == null) { //添加根节点 Node.Text = Row["groupname"].ToString(); treeView1.Nodes.Add(Node); AddTree(Int32.Parse(Row["groupid"].ToString()), Node); /...
使用TreeNode控件和ListView控件显示电脑的各盘文件及目录。