单表数据加载到TreeView(.Node.Level>=2) "蝴蝶效应" SelectedNode注意事项 效能优化 综合问题
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; namespace 将单表数据加载到TreeView
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
string constr = ConfigurationManager.ConnectionStrings["sql"].ConnectionString; #region 这是删除节点的代码
private void btnDelete_Click(object sender, EventArgs e)
{
DeleteNodes(tvList.SelectedNode.Tag.ToString());
//将当前用户选定的节点删除(含所有子节点)
tvList.SelectedNode.Remove();
}
public void DeleteNodes(string id)
{
string sql1 = "select AreaId from TblArea where AreaPId=@PID";
DataTable dt = this.ExecuteDataTable(sql1, new SqlParameter("@PID", id));
foreach (DataRow item in dt.Rows)
{
DeleteNodes(item[].ToString());
}
string sql = "delete from TblArea where AreaId=@ID";
this.ExecuteNonQuery(sql, new SqlParameter("@ID", id)); }
//public DataTable ExecuteDataTable(string sql, params SqlParameter[] param)
//{
// DataTable dt = new DataTable();
// using (SqlDataAdapter adapter = new SqlDataAdapter(sql, constr))
// {
// if (param != null)
// {
// adapter.SelectCommand.Parameters.AddRange(param);
// }
// adapter.Fill(dt);
// }
// return dt;
//}
public int ExecuteNonQuery(string sql, params SqlParameter[] param)
{
using (SqlConnection con = new SqlConnection(constr))
{
using (SqlCommand cmd = new SqlCommand(sql, con))
{
if (param != null)
{
cmd.Parameters.AddRange(param);
}
con.Open();
return cmd.ExecuteNonQuery();
}
}
}
#endregion #region 3. 给Node添加点击事件,然后加载其子节点
private void btnAppend_Click(object sender, EventArgs e)
{
//貌似这个是单击此节点的事件。事实上是上一个选中节点的事件
//就算你初始化了某个节点 tvList.Nodes[0].Checked = true;
//但是tvList.Nodes[0].IsSelected = false; 所以不用这个,用这个也可以:
//加一些东西:
tvList.NodeMouseClick += tvList_NodeMouseClick;
//用这个:
//tvList.AfterSelect += tvList_AfterSelect;
ThirdDeepList(.ToString(), tvList.Nodes);
} void tvList_AfterSelect(object sender, TreeViewEventArgs e)
{
#region 这是追加节点的代码
//string id = e.Node.Tag.ToString();
//this.ThirdDeepList(id, ((TreeView)sender).SelectedNode.Nodes);
#endregion
} void tvList_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
string id = e.Node.Tag.ToString();
//this.ThirdDeepList(id, ((TreeView)sender).SelectedNode.Nodes);
//加的东西
this.ThirdDeepList(id, e.Node.Nodes);
} private void ThirdDeepList(string id, TreeNodeCollection treeNodeCollection)
{
string sql = "select AreaId ,AreaName from TblArea where AreaPId=@PID";
using (DataTable dt = this.ExecuteDataTable(sql, new SqlParameter("@PID", id)))
{
int count = dt.Rows.Count;
if (count > )
{
for (int i = ; i < count; i++)
{
TreeNode tn = treeNodeCollection.Add(dt.Rows[i][].ToString());
tn.Tag = dt.Rows[i][].ToString();
}
}
}
} public DataTable ExecuteDataTable(string sql, params SqlParameter[] param)
{
DataTable dt = new DataTable();
using (SqlDataAdapter adapter = new SqlDataAdapter(sql, constr))
{
if (param != null)
{
adapter.SelectCommand.Parameters.AddRange(param);
}
adapter.Fill(dt);
}
return dt;
}
#endregion //#region 2. 使用递归
////这样写表面上代码看起来没问题。实际上是严重的性能消耗的失败品......
//private void btnAppend_Click(object sender, EventArgs e)
//{
// SecondDeepList(0.ToString(), tvList.Nodes);
//}
//private void SecondDeepList(string id, TreeNodeCollection tnc)
//{
// string sql = "select * from TblArea where AreaPId=@PID";
// using (SqlDataReader reader = this.ExecuteReader(sql, new SqlParameter("@PID", id)))
// {
// if (reader.HasRows)
// {
// while (reader.Read())
// {
// TreeNode tn = tnc.Add(reader[1].ToString());
// tn.Tag = reader[0].ToString();
// this.SecondDeepList(tn.Tag.ToString(), tn.Nodes);
// }
// }
// }
//}
//private SqlDataReader ExecuteReader(string sql, params SqlParameter[] param)
//{
// SqlConnection con = new SqlConnection(constr);
// using (SqlCommand cmd = new SqlCommand(sql, con))
// {
// if (param != null)
// cmd.Parameters.AddRange(param);
// con.Open();
// return cmd.ExecuteReader(CommandBehavior.CloseConnection);
// }
//}
//#endregion //#region 1. 一下子全部加载到TreeView上来。不提倡,给用户感觉程序不“利索”
//private void btnAppend_Click(object sender, EventArgs e)
//{
// string sql = "select * from TblArea where AreaPId=@PID";
// string PID = "0";
// DataTable dt = this.ExecuteDataTable(sql, new SqlParameter("@PID", PID));
// int count = dt.Rows.Count;
// if (count > 0)
// {
// for (int i = 0; i < count; i++)
// {
// TreeNode tn = tvList.Nodes.Add(dt.Rows[i][1].ToString());
// tn.Tag = dt.Rows[i][0].ToString();
// this.FirstDeepList(tn.Tag.ToString(), tn);
// }
// }
//}
//public void FirstDeepList(string id, TreeNode tn)
//{
// string sql = "select AreaId ,AreaName from TblArea where AreaPId=@PID";
// string PID = id;
// DataTable dt = this.ExecuteDataTable(sql, new SqlParameter("@PID", id));
// int count = dt.Rows.Count;
// if (count > 0)
// {
// for (int i = 0; i < count; i++)
// {
// TreeNode newtn = tn.Nodes.Add(dt.Rows[i][1].ToString());
// newtn.Tag = dt.Rows[i][0].ToString();
// this.FirstDeepList(newtn.Tag.ToString(), newtn);
// }
// }
//}
//public DataTable ExecuteDataTable(string sql, params SqlParameter[] param)
//{
// DataTable dt = new DataTable();
// using (SqlDataAdapter adapter = new SqlDataAdapter(sql, constr))
// {
// if (param != null)
// {
// adapter.SelectCommand.Parameters.AddRange(param);
// }
// adapter.Fill(dt);
// }
// return dt;
//}
//#endregion
}
}
项目数据文件:http://pan.baidu.com/s/1gd3gifL
单表数据加载到TreeView(.Node.Level>=2) "蝴蝶效应" SelectedNode注意事项 效能优化 综合问题的更多相关文章
- 九:MVC主从表数据加载
EF对关联表数据加载的三种方式: 延迟加载:只有在需要的时候加载数据.EF默认的加载方式. 贪婪加载:一次性组织好数据,全部加载到内存中. 显式加载:需要通过代码手动加载关联表. 延迟加载 virtu ...
- 第2节 hive基本操作:11、hive当中的分桶表以及修改表删除表数据加载数据导出等
分桶表 将数据按照指定的字段进行分成多个桶中去,说白了就是将数据按照字段进行划分,可以将数据按照字段划分到多个文件当中去 开启hive的桶表功能 set hive.enforce.bucketing= ...
- 省市数据递归加载到TreeView
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- MYSQL(将数据加载到表中)
1. 创建和选择数据库 mysql> CREATE DATABASE menagerie; mysql> USE menagerie Database changed 2. 创建表 mys ...
- flask+sqlite3+echarts3+ajax 异步数据加载
结构: /www | |-- /static |....|-- jquery-3.1.1.js |....|-- echarts.js(echarts3是单文件!!) | |-- /templates ...
- 实现虚拟模式的动态数据加载Windows窗体DataGridView控件 .net 4.5 (一)
实现虚拟模式的即时数据加载Windows窗体DataGridView控件 .net 4.5 原文地址 :http://msdn.microsoft.com/en-us/library/ms171624 ...
- ECharts动态数据加载
最近有用到ECharts做可视化报表,小结一下 一.准备数据 1.官网下载echarts.min.js 2.引入jquery.js 3.请求用的json数据 { "list":[ ...
- MySQL单表数据不超过500万:是经验数值,还是黄金铁律?
今天,探讨一个有趣的话题:MySQL 单表数据达到多少时才需要考虑分库分表?有人说 2000 万行,也有人说 500 万行.那么,你觉得这个数值多少才合适呢? 曾经在中国互联网技术圈广为流传着这么一个 ...
- MySQL单表数据不要超过500万行:是经验数值,还是黄金铁律?
本文阅读时间大约3分钟. 梁桂钊 | 作者 今天,探讨一个有趣的话题:MySQL 单表数据达到多少时才需要考虑分库分表?有人说 2000 万行,也有人说 500 万行.那么,你觉得这个数值多少才合适呢 ...
随机推荐
- Java实现N*N矩阵旋转(360度)
N*N矩阵旋转 Description 给你一个n*n的矩阵,你的任务是将它逆时针旋转角度d. [输入] 输入的第一个数为T,表示接下来有T组数据. 每组数据的格式如下: 第一行为两个整数n,d.1& ...
- Java实现 蓝桥杯VIP 算法提高 扫雷
算法提高 扫雷 时间限制:1.0s 内存限制:256.0MB 问题描述 扫雷游戏你一定玩过吧!现在给你若干个n×m的地雷阵,请你计算出每个矩阵中每个单元格相邻单元格内地雷的个数,每个单元格最多有8个相 ...
- Java实现 蓝桥杯VIP 算法提高 插入排序
算法提高 插入排序 时间限制:1.0s 内存限制:256.0MB 插入排序 问题描述 排序,顾名思义,是将若干个元素按其大小关系排出一个顺序.形式化描述如下:有n个元素a[1],a[2],-,a[ ...
- SQL server 导入数据 (excel导入到SQL server数据库)
打开数据库SQL server ,右键数据库,任务,导入数据 点击下一步 选择数据源类型 选择路径,点击下一步 选择将要生成的类型 选择登陆方式 选中,点击下一步 点击编辑映射可以修改将要生成的表,点 ...
- Java GUI 键盘事件
import java.awt.FlowLayout; import java.awt.Frame; import java.awt.TextField; import java.awt.event. ...
- 举一个有趣的例子,让你轻松搞懂JVM内存管理
目录 前言 例子 源码 输出 图解 深入分析 学以致用 写在最后 前言 在JAVA虚拟机内存管理中,堆.栈.方法区.常量池等概念经常被提到,对理论知识的理解也常常停留在字面意思上,比如说堆内存中存放对 ...
- 多态的C语言实现版本
#ifndef _51_2_H #define _51_2_H typedef void Demo; typedef void Derived; Demo* Demo_create(int i,int ...
- Shell总结01-shell解释器
常见Shell解释器种类 就像不同地区有不同方言一样,不同的Linux/Unix系统使用着不同类型的shell,其中sh是UNIX上的最基本的shell,遵循POSIX接口规范 操作系统 默认shel ...
- mysql忘记root密码后,重新设置、修改root密码
大致步骤如下(这个步骤针对5.7版本,8.0之后版本修改方式有所改变,版本为8.0之后的可自行搜索相关修改方法) 1. 关闭正在运行的mysql服务,确保mysql服务要先关闭2. 打开dos窗口,转 ...
- 兄弟打印机MFC代码示范
m_strModel.LoadString(IDS_MODEL_STRING); //IDS_MODEL_STRING,字符串控件的ID,资源视图-String Table里面设置 m_strSour ...