自: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)的更多相关文章

  1. ajax基础语法、ajax做登录、ajax做用户名验证是否可用、ajax做关键字查询动态显示、ajax做用表格显示数据并增加操作列

    AJAX: AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新.   ...

  2. C#点击按钮用DataGridView动态增加行、删除行,增加按钮列

    原来有一行: 点击添加,在下面增加同样的一行 新增加的行有一列删除按钮,点击某行的删除按钮时,删除当前行 方法: 哈哈,我果然好聪明啊 1.文本框.文本框.添加按钮 2.一个DataGridView( ...

  3. 在DataTable 中增加一列

    //在这里需要增加一个列.                DataColumn column = dt.Columns.Add("行号", Type.GetType("S ...

  4. Numpy增加一列,指定概率指定参数

    这里主要应用到numpy.random.choice 可以根据需求,比如增加一列,A B C 为该列数据,随机概率生成 详见代码 import numpy as np import pandas as ...

  5. 【sed】增加一列【shell文本处理】

    有些简单的文本处理不需要写程序,利用awk和sed就可以很好的完成. 今天记录一下在已有文件中增加一列的方法 sed -i "s/^/Chr${i}\t&/g" file ...

  6. oracle查询语句查询增加一列内容

    select a,sys_guid() as b from mytable sys_guid() 是生成带分隔符(-)的GUID的自定义函数 查询B表的内容插入A表,MY_ID是A表的主键不可为空,因 ...

  7. Oracle增加一列、修改一列数据类型

    Oracle增加一列.修改一列数据类型: 添加一列: alter   table   A   add( CFYJSNR  varchar2(20)); 修改列: alter  table A  ren ...

  8. Oracle使用row_number()函数查询时增加序号列

    使用Oracle自带的row_number()函数能够实现自动增加序号列的要求,但是同时引发一个问题,如果我们查询出来的数据需要使用Order By排序的话,那么我们会发现新增加的序号列是乱序的,它会 ...

  9. 在MySQL的表中增加一列

    MySql中增加一列 如果想在一个已经建好的表中添加一列,可以用: alter table TABLE_NAME add column NEW_COLUMN_NAME varchar(45) not ...

随机推荐

  1. HDU 1502 - dp + 压位

    传送门 题目大意: 3*n的字符串,A.B.C分别有n个,w(X)代表X字母出现的次数,要求该字符串的所有前缀中w(A) >= w(B) >= w(C),问合法方案数有多少. 题目分析: ...

  2. [GeekBand] 设计模式之观察者模式学习笔记

    本文参考文献::GeekBand课堂内容,授课老师:李建忠 :网络资料: http://blog.csdn.net/hguisu/article/details/7556625 本文仅作为自己的学习笔 ...

  3. 【14.67%】【codeforces 615D】Multipliers

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  4. Android菜鸟的成长笔记(23)——获取网络和SIM卡信息

    TelephonyManager是一个管理手机通话状态.电话网络信息的服务类,该类提供了大量的getXxx()方法来获取电话网络的相关信息.这些信息包括设备编号.软件版本.网络运营商代号.网络运营商名 ...

  5. WPF 触摸到事件

    原文:WPF 触摸到事件 本文从代码底层告诉大家,在触摸屏幕之后是如何拿到触摸点并且转换为事件 在 WPF 界面框架核心就是交互和渲染,触摸是交互的一部分.在 WPF 是需要使用多个线程来做触摸和渲染 ...

  6. 嵌套函数中的this

    function countDown(){ var self = this; var doWork = function(){ console.log(this);//window console.l ...

  7. 道量化交易程序猿(25)--Cointrader之MarketData市场数据实体(12)

    转载注明出处:http://blog.csdn.net/minimicall.http://cloudtrade.top/ 前面一节我们说到了远端事件.当中.市场数据就属于远端事件.市场数据有什么?我 ...

  8. matlab 警告(warning)、错误(error)、异常(exception)与断言(assert)

    0. 消息标识符(Message Identifiers) 消息标识符,是附加在 error 和 warning 语句上的一个标签,以被 matlab 做唯一性标识. warning 语句所支持的函数 ...

  9. 算法(algorithm)、模型(model)与框架(framework)

    模型对应的数学公式,公式中往往有待学习得到的参数,因此在进行训练或者学习时,首先初始化这部分参数(0 或标准正太分布): 学习之前的初始化:initial model: 学习完成之后的模型:final ...

  10. 写在程序猿的困惑(特别Java程序猿)入行一年,感觉我不知道接下来该怎么办才能不断进步的,寻求翼

    入行了一年.感觉不知道接下来该怎么做才干继续进步了,求不吝赐教(V2EX) @kafka0102 :做技术能够学的东西太多了.仅仅是在不同的阶段做好不同的规划.要结合当前所做的事情去做更深入或广度的学 ...