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. js原生插件格式解析

    一个合格的插件必须满足以下要求: 1.拥有独立作用域与用户作用域隔离,插件内的私有变量不可影响用户定义的变量 2.拥有默认参数 3.提供配置方法让用户可改变参数 4.提供监听接口,以监听页面操作 5. ...

  2. for循环执行流程

    语句格式: for(表达式1;表达式2;表达式3) { 循环体 } 表达式1:赋值表达式,用来给控制变量赋初值.(只执行一次) 表达式2:逻辑表达式,是循环的控制条件,用来判断控制变量是否符合循环条件 ...

  3. 简单web作业---书籍介绍的相关网页编写

    老师布置的web作业,我做了3个页面,其中有利用老师的css代码! 我有添加背景音乐,下面的是主界面的代码. <!DOCTYPE html> <html> <head&g ...

  4. FIND_IN_SET的简单使用

    FIND_IN_SET(str,strlist)函数 str 要查询的字符串 strlist 字段名 参数以”,”分隔 如 (1,2,6,8) 查询字段(strlist)中包含(str)的结果,返回结 ...

  5. 智能穿戴设备移动APP端与外设数据传输协议

    S1 Communication Layer specifications 1. Purpose of This Document                                    ...

  6. windows系统JDK的安装及环境配置

    本文转载至:http://blog.csdn.net/sweetburden2011/article/details/8881181 一:JDK的安装 1.   首先上甲骨文公司的官方网站下载JDK的 ...

  7. iOS定位和位置信息获取

    要实现地图.导航功能,往往需要先熟悉定位功能,在iOS中通过Core Location框架进行定位操作.Core Location自身可以单独使用,和地图开发框架MapKit完全是独立的,但是往往地图 ...

  8. JavaScript -- 操作input CheckBox 全选框

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. Nova中的系统状态分析

    系统状态 作者 孔令贤 Nova提供这么几个资源状态的查询. Service Nova中的service有两类,一类是所谓的control service,一类就是compute service.要想 ...

  10. Linux下Apache的安装与配置

    本文安装的httpd版本为httpd 2.4.4安装之前确保 Development Libraries与Development tools安装上.安装方法参考:http://www.linuxidc ...