在DBGrid增加一列CheckBox(而非DBCheckBox)
自:http://rabbitfox.blog.sohu.com/33264033.html
http://community.csdn.net/Expert/topic/5342/5342920.xml?temp=.9525568
问:如何使dbgrid增加一列类似checkbox的控件,可以用鼠标来选择该行是否被选中,可以多选
最好的思路还是要在数据表里增加一个布尔字段,然后用DBCheckBox与它关联,而不是CheckBox。(至于在DBGrid里嵌入DBCheckBox的方法,可以参考:http://topic.csdn.net/t/20021118/16/1186480.html)
如果就是不希望在数据表里增加一个布尔字段,就是想用CheckBox,下面是我的测试代码供参考:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, DB, Grids, DBGrids, DBTables;
type
TForm1 = class(TForm)
Table1: TTable; //这里用一个Table做测试。用其他的DataSet,如Query、ADOQuery等一样
DBGrid1: TDBGrid;
DataSource1: TDataSource;//DataSource1如果换名字,下面的代码要随之更换
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure ChkOnClick(Sender: TObject); //注意
end;
var
Form1: TForm1;
ChksState : array of boolean; //全程数组,存放每条记录的CheckBox状态
implementation
{$R *.dfm}
procedure TForm1.ChkOnClick(Sender: TObject); //所有CheckBox的Click事件
begin
if TCheckBox(Sender).Checked then
ChksState[DataSource1.DataSet.RecNo-1] := true
else
ChksState[DataSource1.DataSet.RecNo-1] := false;
end;
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
Chk : TCheckBox;
begin
if (TDBGrid(Sender).DataSource.DataSet.Active) and (DataCol = 0) then
begin
Chk := TCheckBox.Create(self);
Chk.Left := Rect.Left + TDBGrid(Sender).Left + 2;
Chk.Top := Rect.Top + TDBGrid(Sender).top + 2;
Chk.Height := Rect.Bottom - Rect.Top - 2;
Chk.Width := Chk.Height;
Chk.Color := clWhite;
if ChksState[TDBGrid(Sender).DataSource.DataSet.RecNo-1] then
Chk.Checked := true else Chk.Checked := false;
Chk.OnClick := ChkOnClick; //注意
Chk.Parent := Self;
Chk.Visible := true;
end;
end;
procedure TForm1.Button1Click(Sender: TObject); //打开数据源并构建DBGrid
var
I : integer;
begin
with DBGrid1 do
begin
DataSource := DataSource1;
DataSource.DataSet.Open;
SetLength(ChksState,DataSource.DataSet.RecordCount);
for I := 0 to DataSource.DataSet.FieldCount do
Columns.Add;
Columns[0].Title.Caption := 'Check';
for I := 1 to DataSource.DataSet.FieldCount do
begin
Columns[I].Field := DataSource.DataSet.Fields[I-1];
Columns[I].Title.Caption := 'Field_' + IntToStr(I);
end;
end;
end;
procedure TForm1.Button2Click(Sender: TObject); //测试
begin
if ChksState[DataSource1.DataSet.RecNo-1] then
showmessage('当前记录状态= 选中!')
else
showmessage('当前记录 未选中');
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Table1.Close;
DataSource1.DataSet := Table1;
end;
end.
在这个测试里,我用了一个Table,其DataBaseName和TableName属性,读者自己设置。在测试效果按钮Button2里,写出了调用Checked状态的方法:那就是通过DataSet.RecNo对应的ChksState数组元素,来知道该记录是否选中。
这仅是一个演示代码。可以看出,劳心费力绞尽脑汁这么多代码,仅仅是实现了这么一点点功能,并且,一些特殊情况(如:新增、移动、更新、删除记录)还没有考虑。
所以,尽可能不采用DBGrid这种控件--->如果实在要用,并且要实现类似功能,那就首选一些三方控件--->如果不想用三方控件,那就尽量把功夫放在DataSet里---->最笨的办法就是象我写的这个测试一样:把精力都放在了摆放控件里了。这样实际上是走了弯路。
http://www.cnblogs.com/hssbsw/archive/2012/06/15/2551438.html
在DBGrid增加一列CheckBox(而非DBCheckBox)的更多相关文章
- ajax基础语法、ajax做登录、ajax做用户名验证是否可用、ajax做关键字查询动态显示、ajax做用表格显示数据并增加操作列
AJAX: AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新. ...
- C#点击按钮用DataGridView动态增加行、删除行,增加按钮列
原来有一行: 点击添加,在下面增加同样的一行 新增加的行有一列删除按钮,点击某行的删除按钮时,删除当前行 方法: 哈哈,我果然好聪明啊 1.文本框.文本框.添加按钮 2.一个DataGridView( ...
- 在DataTable 中增加一列
//在这里需要增加一个列. DataColumn column = dt.Columns.Add("行号", Type.GetType("S ...
- Numpy增加一列,指定概率指定参数
这里主要应用到numpy.random.choice 可以根据需求,比如增加一列,A B C 为该列数据,随机概率生成 详见代码 import numpy as np import pandas as ...
- 【sed】增加一列【shell文本处理】
有些简单的文本处理不需要写程序,利用awk和sed就可以很好的完成. 今天记录一下在已有文件中增加一列的方法 sed -i "s/^/Chr${i}\t&/g" file ...
- oracle查询语句查询增加一列内容
select a,sys_guid() as b from mytable sys_guid() 是生成带分隔符(-)的GUID的自定义函数 查询B表的内容插入A表,MY_ID是A表的主键不可为空,因 ...
- Oracle增加一列、修改一列数据类型
Oracle增加一列.修改一列数据类型: 添加一列: alter table A add( CFYJSNR varchar2(20)); 修改列: alter table A ren ...
- Oracle使用row_number()函数查询时增加序号列
使用Oracle自带的row_number()函数能够实现自动增加序号列的要求,但是同时引发一个问题,如果我们查询出来的数据需要使用Order By排序的话,那么我们会发现新增加的序号列是乱序的,它会 ...
- 在MySQL的表中增加一列
MySql中增加一列 如果想在一个已经建好的表中添加一列,可以用: alter table TABLE_NAME add column NEW_COLUMN_NAME varchar(45) not ...
随机推荐
- nth-child与nth-of-type
nth-of-type这个CSS3伪类还从来没有用过,今天好好研究一番,发现还是有用的.现在下面的Demo <!DOCTYPE html> <html> <head> ...
- android studio中文乱码各种情况的解决办法
情况一:编辑器内的中文注释乱码. 解决办法:在界面的右下角找到 UTF-8 ,单击之,在弹出的列表中选中GBK 在弹出框内选中Reload 总结:导致这样的原因是你这个.java文件本身是GBK编码的 ...
- 超级简单的9patch
转载请声明出处:http://blog.csdn.net/dawanganban 我们在有些应用中会用到将图片内部指定区域撑大的效果,如微信中的消息内容背景,这时候就要用到9patch图片,效果如下: ...
- Android高度仿新浪微博引导页面
在写这一篇文章之前,先向大家推荐一篇博文:http://blog.csdn.net/dawanganban/article/details/17297671 感谢这位博主,我在该博主的基础上完成了对新 ...
- postman VS restlet client基本使用
postman与restlet都是使用的google浏览器的插件(出不去自行解决,you get!),此两款软件的强大这里就不在赘述了,postman的网上说明很多,restlet的中文配置很少了.这 ...
- 深度学习实战 Tricks
1. 梯度消失与梯度爆炸 gradient clipping 梯度爆炸:min(grad_max,grad) grad_max:梯度上限 梯度消失:max(grad_min, grad) grad_m ...
- Windows系统的四个重要概念——进程、线程、虚拟内存、内核模式和用户模式
引言 本来在写一篇Windows内存管理的文章,写着写着就发现好多基础的概念都要先讲.更可怕的是,这些基础的概念我却不能完全讲清楚.只好再把这本<深入解析Windows操作系统>翻到第一章 ...
- wxWidgets编译和在VC 6.0中的配置
1. 安装 运行wxMSW-2.8.3-Setup1.exe,将之安装到不带空格符号的目录中,本例为C:/wxWidgets-2.8.3: 2. 编译和配置 (1) 用VC6.0编译 进入C: ...
- Frequentist 观点和 Bayesian 观点
1. Frequentist view Frequentist approach views the model parameters as unknown constants(未知的常数,而不是一个 ...
- Expression Design与Blend制作滚动的小球动画教程
原文:Expression Design与Blend制作滚动的小球动画教程 一,开发工具 Microsoft Expression Design & Blend 4.0 (3.0亦可). 这两 ...