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 ...
随机推荐
- QT中文乱码处理
在程序中直接使用中文,需要在程序中加入以下代码: #include <QTextCodec> int main(int argc, char **argv) { QApplication ...
- 使用concurrent.futures和ProcessPoolExecutor来替代线程和进程
concurrent.futures和ProcessPoolExecutor这两个类实现的借口分别在不同的线程或进程中执行可调用的对象,这两个类在内部维护者一个工作线程或进程池,以及要执行的队列,这两 ...
- java基础之final/static/static final
一.final 1.final修饰变量(常量) final修饰的成员变量表示常量,一旦给定初值既无法改变 2.final方法 final修饰方法,表示该方法不能被子类重写 好处:比非final方法要快 ...
- 高通LCD驱动调试
本文转载自:http://www.itgo.me/a/x6305658852004979994/lcd%20qcom 来自 :http://blog.csdn.net/dacaozuo/article ...
- Go 书单
一.<Go语言学习笔记> (未找到对应版本的电子书,大家可以去作者github:https://github.com/qyuhen/book) 推荐理由:作为时下流行的一种系统编程语言,G ...
- JMeter学习(九)分布式部署
Jmeter 是java 应用,对于CPU和内存的消耗比较大,因此,当需要模拟数以千计的并发用户时,使用单台机器模拟所有的并发用户就有些力不从心,甚至会引起JAVA内存溢出错误.为了让jmeter工具 ...
- div css 练习1
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- poj 2116 Death to Binary? 模拟
Death to Binary? Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1707 Accepted: 529 D ...
- (转) Nova是如何统计OpenStack资源
引言 运维的同事常常遇到这么四个问题: Nova 如何统计 OpenStack 计算资源? 为什么 free_ram_mb, free_disk_gb 有时会是负数? 即使 free_ram_mb, ...
- php的http数据传输get/post...
php的http数据传输get/post... 一般有:file_get_contents,curl,fsockopen.... 下面介绍fsockopen: //构造要post的字符串 $argv ...