TreeView 树节点的处理

 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using WinForm_CRUD.BLL;
using WinForm_CRUD.Model; namespace WinForm_TestTree
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} MyORM_BLL myORM_BLL = new MyORM_BLL(); /// <summary>
/// import Area
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnImportArea_Click(object sender, EventArgs e)
{ } /// <summary>
/// 窗口加载时 省市联动
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_Load(object sender, EventArgs e)
{
LoadAlllNodes();
} /// <summary>
/// 加载所有节点
/// </summary>
private void LoadAlllNodes()
{
treeView1.Nodes.Clear();
//根据PID=0查询省
List<Object> list = myORM_BLL.SelectModelByField(typeof(T_AREA), "PID=0");
//for 遍历省
foreach (Object obj in list)
{
T_AREA area = (T_AREA)obj;
TreeNode nodePro = new TreeNode(area.NAME);
nodePro.Tag = area.ID;
//根据省ID 即PID查询市 遍历市 把市节点加入省(即需要省ID 和省节点递归)
RecursionCity(nodePro, area);
//把省节点加入treeview
treeView1.Nodes.Add(nodePro);
}
} /// <summary>
/// 递归加载市和县
/// </summary>
/// <param name="node">上一级节点,比如省节点</param>
/// <param name="area">上一级对象,比如省,提供下一级的PID</param>
private void RecursionCity(TreeNode node, T_AREA area)
{
List<Object> list = myORM_BLL.SelectModelByField(typeof(T_AREA), "PID=" + area.ID);
foreach(Object obj in list)
{
T_AREA areaCity = (T_AREA)obj;
TreeNode nodeCity = new TreeNode(areaCity.NAME);
nodeCity.Tag = areaCity.ID;
RecursionCity(nodeCity, areaCity); //再次递归获得县节点
node.Nodes.Add(nodeCity);
}
} /// <summary>
/// 删除节点
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnDeleteNode_Click(object sender, EventArgs e)
{
//判断是否选中
if (treeView1.SelectedNode == null)
{
MessageBox.Show("请先选中要删除的节点");
return;
}
string name = treeView1.SelectedNode.Text;
int id = (Int32)treeView1.SelectedNode.Tag;
//提示是否删除
if(MessageBox.Show("您确定要删除节点"+name+"吗?","提示",MessageBoxButtons.OKCancel,MessageBoxIcon.Warning)!=DialogResult.OK)
{
return;
}
//根据ID删除 递归
//在根据ID删除省之前,先要删除省下面所有的市,删除每个市之前,先要删除市下面所有的县
RecursionDeleteCity(id);
myORM_BLL.DeleteModelById(typeof(T_AREA), id);
//重新加载数据
MessageBox.Show("删除成功");
LoadAlllNodes();
} /// <summary>
/// 根据省ID删除下面的所有市,递归 根据市ID删除下面的所有县
/// </summary>
/// <param name="id"></param>
private void RecursionDeleteCity(int id)
{
//根据省ID查询所有市
List<Object> list = myORM_BLL.SelectModelByField(typeof(T_AREA), "PID=" + id);
//for市
foreach(Object obj in list)
{
T_AREA areaCity = (T_AREA)obj;
//根据市ID删除之前,先删除市下面的所有的县
RecursionDeleteCity(areaCity.ID);
myORM_BLL.DeleteModelById(typeof(T_AREA), areaCity.ID);
}
} /// <summary>
/// 双击事件 进行编辑
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void treeView1_DoubleClick(object sender, EventArgs e)
{
//是否选中
if (treeView1.SelectedNode == null)
{
MessageBox.Show("请先选中要编辑的节点");
return;
}
//获得选中的节点
TreeNode node = treeView1.SelectedNode;
//设置节点为可编辑状态
node.BeginEdit();
//获得改变的文本
T_AREA area=new T_AREA();
area.NAME = node.Text.Trim();
area.ID = (Int32)node.Tag;
area.PID = node.Parent==null?:(Int32)node.Parent.Tag; //父节点pid
//根据节点ID更新
bool flag = myORM_BLL.UpdateModel(area);
string msg = flag ? "更新成功" : "更新失败";
MessageBox.Show(msg);
//刷新
LoadAlllNodes();
} private event EventHandler _evt;
private MyEventArg mea = new MyEventArg(); /// <summary>
/// 新增节点
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnAddNew_Click(object sender, EventArgs e)
{
//是否选中父节点,如果不选中,默认父节点为0
TreeNode node = treeView1.SelectedNode;
int id = node == null ? : (Int32)node.Tag;
//获得父节点ID,即PID
mea.area = new T_AREA();
mea.area.PID = id; //新增传PID
AddNewAndEdit();
} /// <summary>
/// 编辑节点
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnEdit_Click(object sender, EventArgs e)
{
//是否选中
if (treeView1.SelectedNode == null)
{
MessageBox.Show("请先选中要编辑的节点");
return;
}
//获得节点ID
int id = (Int32)treeView1.SelectedNode.Tag;
mea.area = new T_AREA();
mea.area.ID = id; //编辑传ID
mea.area.PID = treeView1.SelectedNode.Parent == null ? : (Int32)treeView1.SelectedNode.Parent.Tag;
AddNewAndEdit();
} /// <summary>
/// 编辑和新增
/// </summary>
/// <param name="p"></param>
private void AddNewAndEdit(int p)
{
mea.Tp = p;
Form2 f2 = new Form2();
//注册事件
this._evt += new EventHandler(f2.SetText);
if(this._evt!=null)
{
this._evt(this, mea);
}
if (f2.ShowDialog() == DialogResult.OK)
{
f2.Close();
LoadAlllNodes();
}
else if (f2.ShowDialog() == DialogResult.Cancel)
{
f2.Close();
}
}
}
public class MyEventArg : EventArgs
{
/// <summary>
/// 1 新增,2 编辑
/// </summary>
public int Tp { get; set; }
/// <summary>
/// 节点实例
/// </summary>
public T_AREA area { get; set; }
}
}
 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using WinForm_CRUD.BLL;
using WinForm_CRUD.Model; namespace WinForm_TestTree
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} MyORM_BLL myORM_BLL = new MyORM_BLL(); /// <summary>
/// import Area
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnImportArea_Click(object sender, EventArgs e)
{ } /// <summary>
/// 窗口加载时 省市联动
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_Load(object sender, EventArgs e)
{
LoadAlllNodes();
} /// <summary>
/// 加载所有节点
/// </summary>
private void LoadAlllNodes()
{
treeView1.Nodes.Clear();
//根据PID=0查询省
List<Object> list = myORM_BLL.SelectModelByField(typeof(T_AREA), "PID=0");
//for 遍历省
foreach (Object obj in list)
{
T_AREA area = (T_AREA)obj;
TreeNode nodePro = new TreeNode(area.NAME);
nodePro.Tag = area.ID;
//根据省ID 即PID查询市 遍历市 把市节点加入省(即需要省ID 和省节点递归)
RecursionCity(nodePro, area);
//把省节点加入treeview
treeView1.Nodes.Add(nodePro);
}
} /// <summary>
/// 递归加载市和县
/// </summary>
/// <param name="node">上一级节点,比如省节点</param>
/// <param name="area">上一级对象,比如省,提供下一级的PID</param>
private void RecursionCity(TreeNode node, T_AREA area)
{
List<Object> list = myORM_BLL.SelectModelByField(typeof(T_AREA), "PID=" + area.ID);
foreach(Object obj in list)
{
T_AREA areaCity = (T_AREA)obj;
TreeNode nodeCity = new TreeNode(areaCity.NAME);
nodeCity.Tag = areaCity.ID;
RecursionCity(nodeCity, areaCity); //再次递归获得县节点
node.Nodes.Add(nodeCity);
}
} /// <summary>
/// 删除节点
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnDeleteNode_Click(object sender, EventArgs e)
{
//判断是否选中
if (treeView1.SelectedNode == null)
{
MessageBox.Show("请先选中要删除的节点");
return;
}
string name = treeView1.SelectedNode.Text;
int id = (Int32)treeView1.SelectedNode.Tag;
//提示是否删除
if(MessageBox.Show("您确定要删除节点"+name+"吗?","提示",MessageBoxButtons.OKCancel,MessageBoxIcon.Warning)!=DialogResult.OK)
{
return;
}
//根据ID删除 递归
//在根据ID删除省之前,先要删除省下面所有的市,删除每个市之前,先要删除市下面所有的县
RecursionDeleteCity(id);
myORM_BLL.DeleteModelById(typeof(T_AREA), id);
//重新加载数据
MessageBox.Show("删除成功");
LoadAlllNodes();
} /// <summary>
/// 根据省ID删除下面的所有市,递归 根据市ID删除下面的所有县
/// </summary>
/// <param name="id"></param>
private void RecursionDeleteCity(int id)
{
//根据省ID查询所有市
List<Object> list = myORM_BLL.SelectModelByField(typeof(T_AREA), "PID=" + id);
//for市
foreach(Object obj in list)
{
T_AREA areaCity = (T_AREA)obj;
//根据市ID删除之前,先删除市下面的所有的县
RecursionDeleteCity(areaCity.ID);
myORM_BLL.DeleteModelById(typeof(T_AREA), areaCity.ID);
}
} /// <summary>
/// 双击事件 进行编辑
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void treeView1_DoubleClick(object sender, EventArgs e)
{
//是否选中
if (treeView1.SelectedNode == null)
{
MessageBox.Show("请先选中要编辑的节点");
return;
}
//获得选中的节点
TreeNode node = treeView1.SelectedNode;
//设置节点为可编辑状态
node.BeginEdit();
//获得改变的文本
T_AREA area=new T_AREA();
area.NAME = node.Text.Trim();
area.ID = (Int32)node.Tag;
area.PID = node.Parent==null?:(Int32)node.Parent.Tag; //父节点pid
//根据节点ID更新
bool flag = myORM_BLL.UpdateModel(area);
string msg = flag ? "更新成功" : "更新失败";
MessageBox.Show(msg);
//刷新
LoadAlllNodes();
} private event EventHandler _evt;
private MyEventArg mea = new MyEventArg(); /// <summary>
/// 新增节点
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnAddNew_Click(object sender, EventArgs e)
{
//是否选中父节点,如果不选中,默认父节点为0
TreeNode node = treeView1.SelectedNode;
int id = node == null ? : (Int32)node.Tag;
//获得父节点ID,即PID
mea.area = new T_AREA();
mea.area.PID = id; //新增传PID
AddNewAndEdit();
} /// <summary>
/// 编辑节点
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnEdit_Click(object sender, EventArgs e)
{
//是否选中
if (treeView1.SelectedNode == null)
{
MessageBox.Show("请先选中要编辑的节点");
return;
}
//获得节点ID
int id = (Int32)treeView1.SelectedNode.Tag;
mea.area = new T_AREA();
mea.area.ID = id; //编辑传ID
mea.area.PID = treeView1.SelectedNode.Parent == null ? : (Int32)treeView1.SelectedNode.Parent.Tag;
AddNewAndEdit();
} /// <summary>
/// 编辑和新增
/// </summary>
/// <param name="p"></param>
private void AddNewAndEdit(int p)
{
mea.Tp = p;
Form2 f2 = new Form2();
//注册事件
this._evt += new EventHandler(f2.SetText);
if(this._evt!=null)
{
this._evt(this, mea);
}
if (f2.ShowDialog() == DialogResult.OK)
{
f2.Close();
LoadAlllNodes();
}
else if (f2.ShowDialog() == DialogResult.Cancel)
{
f2.Close();
}
} /// <summary>
/// 加载 制定目录中的所有文件及目录
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnLoadAllDirectories_Click(object sender, EventArgs e)
{
//加载根目录,创建节点
DirectoryInfo dir = new DirectoryInfo(@"G:\TianYu");
TreeNode node = new TreeNode(dir.Name);
//加入节点集合之前 需要先获得子目录,并都加入根节点 递归
RecursionAddDirectory(node, dir);
//加入treeview
treeviewDirectories.Nodes.Add(node);
} /// <summary>
/// 递归 目录dir下的子目录和文件加入节点node的节点集合中
/// </summary>
/// <param name="node"></param>
/// <param name="dir"></param>
private void RecursionAddDirectory(TreeNode node, DirectoryInfo dir)
{
//获得目录dir下的所有字目录,加入node的节点集合,在加入节点node之前需要递归获取当前的子目录和文件
DirectoryInfo[] dirs = dir.GetDirectories();
foreach(DirectoryInfo direct in dirs)
{
TreeNode nodeDir = new TreeNode(direct.Name);
RecursionAddDirectory(nodeDir, direct); //递归 direct目录下的子目录和文件 加入nodeDir下的节点集合
node.Nodes.Add(nodeDir);
}
//获得目录dir下的所有子文件,加入node的节点集合
FileInfo[] files = dir.GetFiles();
foreach(FileInfo file in files)
{
TreeNode nodeFile = new TreeNode(file.Name);
node.Nodes.Add(nodeFile);
}
}
}
public class MyEventArg : EventArgs
{
/// <summary>
/// 1 新增,2 编辑
/// </summary>
public int Tp { get; set; }
/// <summary>
/// 节点实例
/// </summary>
public T_AREA area { get; set; }
}
}

树节点的处理

TreeView 树节点的处理的更多相关文章

  1. 初始化bootstrap treeview树节点

    最近在做启明星图库时,使用了Jquery Bootstrap  Treeview插件.但是,遇到了一个初始化的问题.先看效果如下: 当用户打开图库时,左边分类第一个类别是“所有分类”,默认需要选中. ...

  2. winform TreeView树节点上下移动

    /// <summary> /// 上移 /// </summary> /// <param name="sender"></param& ...

  3. Access Treeview树节点代码二

    Private Sub Form_Load() '引用C:\windows\system32\MSCOMCTL.OCX,否则提示出错. Dim Rec As New ADODB.Recordset D ...

  4. Access Treeview树节点代码一

    Private Sub TreeView0_Updated(Code As Integer)Dim ndeindex As NodeSet ndeindex = TreeView0.Nodes.Add ...

  5. C#上移,下移TreeView中的树节点顺序

    C#上移,下移TreeView中的树节点顺序 2009-08-12 20:10 1494人阅读 评论(2) 收藏 举报 c#buttonobjectnullstring C#中,通过单击上移,下移按钮 ...

  6. 问题-在TreeView使用时,发现选中的树节点会闪烁或消失

    问题:在工程中选中一个树节点,鼠标焦点在树上,做某种操作时发现选中的点会消失?原因:如果只是BeginUpdate后,没有调用EndUpdate,树会全空.应该是BeginUpdate方法会刷新树,但 ...

  7. Qt qml treeview 树控件

    qml并没有提供树控件,只能自己写了.model仍然用ListModel对象,弄成层级的就行.delegate必须用loader动态的增加子控件,如此而已. [先看效果] [下载] http://do ...

  8. winform中生成TreeView树

    无论是webform还是winform,TreeView都是常用功能.使用递归方法很方便. 下面分享一个小实例. 数据库中3个字段,分别是:ID,itemType_name,itemType_PID ...

  9. Web下TreeView同一节点连续点击,只执行一次SelectedNodeChanged的解决

    Web下TreeView同一节点连续点击,只执行一次SelectedNodeChanged的解决 http://blog.csdn.net/net_boy/archive/2009/11/05/477 ...

随机推荐

  1. LCN协调者服务集群

    官方文档: https://github.com/codingapi/tx-lcn/wiki/TxManager%E9%9B%86%E7%BE%A4%E8%AF%B4%E6%98%8E 核心原理 通过 ...

  2. ZooKeeper服务-操作(API、集合更新、观察者、ACL)

    操作 create:创建一个znode(必须要有父节点)delete:删除一个znode(该znode不能有任何子节点)exists:测试一个znode是否存在并且查询它的元数据getACL,setA ...

  3. HDFS数据流-剖析文件读取及写入

    HDFS数据流-剖析文件读取及写入 文件读取 1. 客户端通过调用FileSystem对象的open方法来打开希望读取的文件,对于HDFS来说,这个对象是分布式文件系统的一个实例.2. Distrib ...

  4. SBT搭建Spark

    http://www.cnblogs.com/yongjian/p/6211007.html http://www.aboutyun.com/thread-8587-1-1.html http://b ...

  5. RowSet

    import java.io.FileInputStream; import java.util.Properties; import javax.sql.rowset.JdbcRowSet; imp ...

  6. Spring boot 更改端口的几种方式

    web服务的默认端口是8080,但有时候我们需要更改成其他端口,这里有几种端口修改方式: 在application.properties文件添加配置(最简单) server.port= 在applic ...

  7. Python之flask总结

    一.flask      a.Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收htt ...

  8. mvn 用指定setting.xml 执行指定pom.xml

    mvn package -f pom.xml -s setting.xml clean install

  9. JProgressBar与Timer的配套使用

    JProgressBar  的关键在于 setMaxium(int maxValue) 和 setValue(int progressValue); 当ProgressBar的当前值需要Control ...

  10. Spinner使用二

    Spinner使用二 一.效果图 二.方法及核心函数 三.代码 后面补