TreeView 树节点的处理
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 树节点的处理的更多相关文章
- 初始化bootstrap treeview树节点
最近在做启明星图库时,使用了Jquery Bootstrap Treeview插件.但是,遇到了一个初始化的问题.先看效果如下: 当用户打开图库时,左边分类第一个类别是“所有分类”,默认需要选中. ...
- winform TreeView树节点上下移动
/// <summary> /// 上移 /// </summary> /// <param name="sender"></param& ...
- Access Treeview树节点代码二
Private Sub Form_Load() '引用C:\windows\system32\MSCOMCTL.OCX,否则提示出错. Dim Rec As New ADODB.Recordset D ...
- Access Treeview树节点代码一
Private Sub TreeView0_Updated(Code As Integer)Dim ndeindex As NodeSet ndeindex = TreeView0.Nodes.Add ...
- C#上移,下移TreeView中的树节点顺序
C#上移,下移TreeView中的树节点顺序 2009-08-12 20:10 1494人阅读 评论(2) 收藏 举报 c#buttonobjectnullstring C#中,通过单击上移,下移按钮 ...
- 问题-在TreeView使用时,发现选中的树节点会闪烁或消失
问题:在工程中选中一个树节点,鼠标焦点在树上,做某种操作时发现选中的点会消失?原因:如果只是BeginUpdate后,没有调用EndUpdate,树会全空.应该是BeginUpdate方法会刷新树,但 ...
- Qt qml treeview 树控件
qml并没有提供树控件,只能自己写了.model仍然用ListModel对象,弄成层级的就行.delegate必须用loader动态的增加子控件,如此而已. [先看效果] [下载] http://do ...
- winform中生成TreeView树
无论是webform还是winform,TreeView都是常用功能.使用递归方法很方便. 下面分享一个小实例. 数据库中3个字段,分别是:ID,itemType_name,itemType_PID ...
- Web下TreeView同一节点连续点击,只执行一次SelectedNodeChanged的解决
Web下TreeView同一节点连续点击,只执行一次SelectedNodeChanged的解决 http://blog.csdn.net/net_boy/archive/2009/11/05/477 ...
随机推荐
- Service Meth and SideCar
本文转自:http://philcalcado.com/2017/08/03/pattern_service_mesh.html SideCar: SideCar就是与Application一起运行的 ...
- maven deploy 代码
Run As --> Run Configurations ---> Maven Build --->New _Configuration(双击Maven Build可生成) --& ...
- sqlserver ,镜像数据库,CDC,实时监控数据变化
1.数据库镜像配置 1)主机环境:计算机名称修改SQL1.xiaoping.com 添加用户sqluser 密码永不变,率属于administrators sqlserver安装时,将所有sqlser ...
- Hadoop的Docker镜像构建
1.Dockerfile ###Dockerfile -- beagin FROM ubuntu:trusty #MAINTAINER The Hue Team "https://githu ...
- 【转】nodejs mysql 链接数据库集群
1.建立数据库连接:createConnection(Object)方法 该方法接受一个对象作为参数,该对象有四个常用的属性host,user,password,database.与php中 ...
- EXCEL中,怎样查看一个工作簿中有几个工作表?
EXCEL中,怎样查看一个工作簿中有几个工作表 有几个EXCEL文件,每个文件(工作簿)中都有上百个工作表, 怎样可以一次性查看一个簿包含几个表? 目前好像没有直接可以看到有多少张工作表的按钮,这就需 ...
- (转)理解Keystone的四种Token
Token 是什么 通俗的讲,token 是用户的一种凭证,需拿正确的用户名/密码向 Keystone 申请才能得到.如果用户每次都采用用户名/密码访问 OpenStack API,容易泄露用户信息, ...
- linux学习-磁盘管理
- 用jQuery Ajax实现前端调用SpringBoot Rest风格API
本文基于: Eclipse下利用Maven创建SpringBoot的Restful风格程序 SpringBoot发布到独立的tomcat中运行 在Tomcat目录的SpringBoot项目中,将ind ...
- python 矩阵转置transpose
在读图片时,会用到这么的一段代码: image_vector_len = np.prod(image_size)#总元素大小,3*55*47 img = Image.open(path) ...