单表数据加载到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实现 蓝桥杯VIP 算法训练 筛选号码
算法训练 筛选号码 Description 有n个人围成一圈,顺序排号(编号为1到n).从第1个人开始报数(从1到3报数),凡报到3的人退出圈子.从下一个人开始继续报数,直到剩下最后一个人,游戏结束. ...
- Java实现 蓝桥杯VIP 算法提高 插入排序
算法提高 插入排序 时间限制:1.0s 内存限制:256.0MB 插入排序 问题描述 排序,顾名思义,是将若干个元素按其大小关系排出一个顺序.形式化描述如下:有n个元素a[1],a[2],-,a[ ...
- java实现第七届蓝桥杯凑平方数
凑平方数 把0~9这10个数字,分成多个组,每个组恰好是一个平方数,这是能够办到的. 比如:0, 36, 5948721 再比如: 1098524736 1, 25, 6390784 0, 4, 28 ...
- java实现第四届蓝桥杯连号区间数
连号区间数 题目描述 小明这些天一直在思考这样一个奇怪而有趣的问题: 在1~N的某个全排列中有多少个连号区间呢?这里所说的连号区间的定义是: 如果区间[L, R] 里的所有元素(即此排列的第L个到第R ...
- 【Jquery】根据元素个数给予宽度
方法一: $(document).ready(function(){ $(".xn_mc_solu_2_ul").css("width", $(".x ...
- DMR对讲机利用XLX网络联网通信
By 申建军 BD8SN 2018-9-29 本文适用于运行G4KLX DMRGateway的MMDVM热点和中继,目前国内绝大部分的热点用户都是使用pi-star镜像的MMDVM热点,均可按此设置. ...
- AndroidCamera开发学习笔记01
概述 Android框架支持设备的相机拍照和录像功能 可以直接调用系统的Camera应用来拍照或录像 也可以利用Adroid系统提供的API开发Camera应用来实现拍照和录像的功能 注意事项 需要硬 ...
- How to Use tomcat on Linux
看是否有tomcat在运行 ps -ef |grep tomcat eg: -bash-4.1# ps -ef |grep tomcat root 1 0 0 14:26 ? 00:00:00 /bi ...
- HTML常用API(位置信息、音频视频)
感谢:链接(讲解的很详细) 位置信息 1.代码: <script type="text/javascript"> navigator.geolocation.getCu ...
- Largest Rectangle in a Histogram【单调栈模板】
Largest Rectangle in a Histogram 题目链接(点击)来源poj 2559 A histogram is a polygon composed of a sequence ...