TreeView和ListView数据库查询数据联动操作
好久不用了,重新整理下放这里以备需要使用,功能见图

数据库表结构

定义TreeView addObject中data存储的记录集
type
PNode = ^TNode; TNode = record
id: Integer;
tcmc: string;
mxid: string;
end;
填充TreeView代码
procedure TForm1.FillTree(TreeView: TTreeView);
var
findq: TADOQuery;
node: TTreeNode;
p: PNode;
//这个方法是根据记录的id字段值,查找TreeView上的父节点
function FindParentNode(id: Integer): TTreeNode;
var
i: Integer;
begin
Result := nil;
for i := 0 to TreeView.Items.Count - 1 do
begin
//比较Node的Data值和记录的id值
if Integer(PNode(TreeView.Items[i].Data).id) = id then
begin
Result := TreeView.Items[i];
Break;
end;
end;
end; begin
findq := TADOQuery.Create(nil);
findq.ConnectionString := 'Provider=SQLOLEDB.1;Password=Sa123;Persist Security Info=True;User ID=demo;Initial Catalog=dd;Data Source=127.0.0.1';
try
TreeView.Items.BeginUpdate;
TreeView.Items.Clear;
findq.SQL.Text := 'SELECT c.id,c.tcmc,c.pid,c.mxid FROM 处方套餐 AS c WITH(NOLOCK) ORDER BY c.id';
findq.Open;
while not findq.Eof do
begin
//将数据放入结构体以便双击时使用
New(p);
p.id := findq.FieldByName('id').AsInteger;
p.tcmc := findq.FieldByName('tcmc').AsString;
p.mxid := findq.FieldByName('mxid').AsString;
//如果是最顶级,直接添加到TreeView
if findq.FieldByName('pid').AsInteger = 0 then
//将导航树保存在Node的Data中,以便查找用
TreeView.Items.AddObject(nil, findq.FieldByName('tcmc').AsString, TObject(p))
else
begin
//查找上级节点,存在上级节点添加子节点
node := FindParentNode(findq.FieldByName('pid').AsInteger);
if node <> nil then
TreeView.Items.AddChildObject(node, findq.FieldByName('tcmc').AsString, TObject(p));
end;
findq.Next;
end;
finally
findq.Free;
TreeView.FullExpand; //展开树
TreeView.Items.EndUpdate;
end;
end;
查询数据调用代码
procedure TForm1.Button1Click(Sender: TObject);
begin
FillTree(TreeView1);
end;
双击TreeView填充ListView
procedure TForm1.TreeView1DblClick(Sender: TObject);
var
mxid: string;
str: TStrings;
I: Integer;
strSql: TStrings;
QryTemp: TADOQuery;
begin
if not TreeView1.Selected.HasChildren then //当前选中是否含有子项,如果有则展开不执行操作
begin
str := TStringList.Create;
strSql := TStringList.Create;
QryTemp := TADOQuery.Create(Self);
try
QryTemp.ConnectionString := 'Provider=SQLOLEDB.1;Password=Sa123;Persist Security Info=True;User ID=demo;Initial Catalog=dd;Data Source=127.0.0.1';
//mxid值:107,108,109,110,111,112
mxid := PNode(TreeView1.Items[TreeView1.Selected.AbsoluteIndex].Data).mxid;
//根据分割符号添加mxid到StringList
str.Delimiter := ',';
str.DelimitedText := mxid;
//查询数据
strSql.Clear;
strSql.Add('SELECT a.DiagnosisProjectID, a.DiagnosisProjectName');
strSql.Add('FROM DDDiagnosisProject AS a WITH(NOLOCK) ');
strSql.Add('WHERE a.DiagnosisProjectID=' + QuotedStr(str[0]));
for I := 1 to str.Count - 1 do
begin
strSql.Add(' OR a.DiagnosisProjectID=' + QuotedStr(str[I]));
end;
strSql.Add('ORDER BY a.DiagnosisProjectID');
with QryTemp do
begin
Close;
SQL.Text := strSql.Text;
Open;
end;
//查询存在数据就添加数据到ListView
if QryTemp.RecordCount > 0 then
begin
QryTemp.First;
ListView1.Items.Clear;
while not QryTemp.Eof do
begin
with ListView1.Items.Add do
begin
Caption := QryTemp.FieldByName('DiagnosisProjectID').AsString;
SubItems.Add(QryTemp.FieldByName('DiagnosisProjectName').AsString);
end;
QryTemp.Next;
end;
end;
finally
str.Free;
strSql.Free;
QryTemp.Free;
end;
end;
end;
点击ListView点击行选中CheckBox
procedure TForm1.ListView1Click(Sender: TObject);
begin
ListView1.Items[ListView1.Selected.Index].Checked := not ListView1.Items[ListView1.Selected.Index].Checked;
end;
ListView全选
procedure TForm1.btnSelectAllClick(Sender: TObject);
var
I: Integer;
begin
for I := 0 to ListView1.Items.Count - 1 do
begin
ListView1.Items[I].Checked := True;
end;
end;
ListView取消选中
procedure TForm1.btnClearSelectClick(Sender: TObject);
var
I: Integer;
begin
for I := 0 to ListView1.Items.Count - 1 do
begin
ListView1.Items[I].Checked := False;
end;
end;
ListView反选
procedure TForm1.btnUnSelectClick(Sender: TObject);
var
I: Integer;
begin
for I := 0 to ListView1.Items.Count - 1 do
begin
ListView1.Items[I].Checked := not ListView1.Items[I].Checked;
end;
end;
查看ListView选中项
procedure TForm1.btnAllCheckedClick(Sender: TObject);
var
i: Integer;
s: string;
begin
Memo1.Clear;
for i := 0 to ListView1.Items.Count - 1 do
begin
if ListView1.Items[i].Checked then
begin
s := s + ListView1.Items[i].Caption + ':' + ListView1.Items[i].SubItems[0] + #13#10;
end;
end;
Memo1.Text := s;
end;
TreeView和ListView数据库查询数据联动操作的更多相关文章
- MYSQL初级学习笔记四:查询数据的操作DQL(SELECT基本形式)(26-35)
知识点六:查询数据的操作DQL(SELECT基本形式)(26-35) CREATE DATABASE IF NOT EXISTS cms DEFAULT CHARACTER SET utf8; USE ...
- 用struts2标签如何从数据库获取数据并在查询页面显示。最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变量。
最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变 ...
- mongodb基础系列——数据库查询数据返回前台JSP(二)
上篇博客论述了,数据库查询数据返回前台JSP.博客中主要使用Ajax调用来显示JSON串,来获取其中某一个字段,赋给界面中的某一个控件. 那这篇博客中,我们讲解,把后台List传递JSP展示. Lis ...
- C#连接Oracle数据库查询数据
C#连接Oracle数据库可以实现许多我们需要的功能,下面介绍的是C#连接Oracle数据库查询数据的方法,如果您对C#连接Oracle数据库方面感兴趣的话,不妨一看. using System; u ...
- koa 基础(二十一)nodejs 操作mongodb数据库 --- 查询数据
1.app.js /** * nodejs 操作mongodb数据库 * 1.安装 操作mongodb * cnpm install mongodb --save * 2.引入 mongodb 下面的 ...
- mongodb基础系列——数据库查询数据返回前台JSP(一)
经过一段时间停顿,终于提笔来重新整理mongodb基础系列博客了. 同时也很抱歉,由于各种原因,没有及时整理出,今天做了一个demo,来演示,mongodb数据库查询的数据在JSP显示问题. 做了一个 ...
- 通过Java代码实现对数据库的数据进行操作:增删改查
在写代码之前,依然是引用mysql数据库的jar包文件:右键项目-构建路径-设置构建路径-库-添加外部JAR 在数据库中我们已经建立好一个表xs :分别有xuehao xingming xue ...
- [转]C#反射,根据反射将数据库查询数据和实体类绑定,并未实体类赋值
本文来自:http://www.cnblogs.com/mrchenzh/archive/2010/05/31/1747937.html /****************************** ...
- python自动化测试之mysql5.0版本数据库查询数据时出现乱码问题分析
1.确保数据库编码是utf8编码.若不是,请将my.ini的client,mysql,mysqld三个字段下面添加default-character-set = utf8,这样可以永久改变在新建数据库 ...
随机推荐
- Discuz ML RCE漏洞
1.漏洞描述 Discuz国际版漏洞存在于cookie的language可控并且没有严格过滤,导致可以远程代码执行. 2.产生原因:Discuz!ML 系统对cookie中的l接收的language参 ...
- 给每个li延时添加样式动画效果(setInterval,clearInterval)
btnsAnime($('ul li')) function btnsAnime(pagesl) { var that = this $(pagesl).hide() let i = 0; funct ...
- Vulhub-Mysql 身份认证绕过漏洞(CVE-2012-2122)
前言 当连接MariaDB/MySQL时,输入的密码会与期望的正确密码比较,由于不正确的处理,会导致即便是memcmp()返回一个非零值,也会使MySQL认为两个密码是相同的.也就是说只要知道用户名, ...
- Windows协议 LDAP篇 - 域权限
windows 访问控制模型 也就是大名鼎鼎的ACM,access control mode 由两部分组成的. 访问令牌(access tokens) 其中包含有关登录用户的信息(User SID,G ...
- 【Android面试查漏补缺】之事件分发机制详解
前言 查漏补缺,查漏补缺,你不知道哪里漏了,怎么补缺呢?本文属于[Android面试查漏补缺]系列文章第一篇,持续更新中,感兴趣的朋友可以[关注+收藏]哦~ 本系列文章是对自己的前段时间面试经历的总结 ...
- Linux虚拟机配置SSH免密登录
本环境为CentOS 7(点击镜像下载iso文件),无图界面. 启动SSH服务 在/usr/sbin/有一个文件为sshd,然后输入绝对路径/usr/sbin/sshd即可开启ssh服务. 然后输入命 ...
- 微信小程序开发——后端Java(一)
一.前言 最近接触了小程序的开发,后端选择Java,因为小程序的代码运行在腾讯的服务器上,而我们自己编写的Java代码运行在我们自己部署的服务器上,所以一开始不是很明白小程序如何与后台进行通信的,然后 ...
- Dart空安全的底层原理与适配
一.在空安全推出之前,静态类型系统允许所有类型的表达式中的每一处都可以有 null. 从类型理论的角度来说,Null 类型被看作是所有类型的子类: 类型会定义一些操作对象,包括 getters.set ...
- 6、二进制安装K8s之部署kubectl
二进制安装K8s之部署kubectl 我们把k8s-master 也设置成node,所以先master上面部署node,在其他机器上部署node也适用,更换名称即可. 1.在所有worker node ...
- 【springboot】过滤器、监听器、拦截器,Aspect切片
转自: https://blog.csdn.net/cp026la/article/details/86501019 简介: 本章介绍拦截器.过滤器.切片对请求拦截的使用与区别,以及监听器在 spri ...