单表数据加载到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实现蓝桥杯模拟带九9的数的个数
问题描述 在1至2019中,有多少个数的数位中包含数字9? 注意,有的数中的数位中包含多个9,这个数只算一次.例如,1999这个数包含数字9,在计算只是算一个数. 答案提交 这是一道结果填空的题,你只 ...
- 第四届蓝桥杯JavaB组省赛真题
解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.世纪末星期 题目描述 曾有邪教称1999年12月31日是世界末日.当然该谣言已经不攻自破. 还有人称今后的某个世纪末的12月31日,如 ...
- java中装箱和拆箱的详细使用(详解)
一.什么是装箱?什么是拆箱? 在前面的文章中提到,Java为每种基本数据类型都提供了对应的包装器类型,至于为什么会为每种基本数据类型提供包装器类型在此不进行阐述,有兴趣的朋友可以查阅相关资料.在Jav ...
- java实现 洛谷 P1540 机器
import java.util.LinkedList; import java.util.Scanner; public class Main { private static Scanner ci ...
- Java实现 黑洞数
任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:65432,一个最小的数23456.求这两个数字的差,得:41976,把这个数字再次重复上述过程(如果不足5位,则 ...
- Pycharm添加Python文件模板
#!/usr/bin/env python# -*- encoding: UTF-8 -*-'''=================================================@P ...
- DMR windows 软件x64
解压缩以后,默认使用串口4的USB热点板,用notepad2软件修改MMDVM.ini的呼号,ID,频率,串口号保存在打开DMR.bat即可,晶体有偏移的运行DMR500.bat https://sh ...
- web静态页面资源访问路径问题
我使用的是idea,今天搭建一个项目时遇见了css和js路径错误,导致浏览器获取不到资源路径 这是我最开始写的路径 <link href="/main/loginMain.css&qu ...
- CORS跨域漏洞学习
简介 网站如果存CORS跨域漏洞就会有用户敏感数据被窃取的风险. 跨域资源共享(CORS)是一种浏览器机制,可实现对位于给定域外部的资源的受控访问.它扩展了同源策略(SOP)并增加了灵活性.但是,如果 ...
- 调用webservice接口,报错:(十六进制值0x01)是无效的字符
#事故现场 调用webservice接口,报错:(十六进制值0x01)是无效的字符. 如图: 意思是webservice返回的信息中包含无效的字符,无法解析成xml: #分析 使用postman向we ...