在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

posted on   癫狂编程  阅读(517)  评论(0编辑  收藏  举报

编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
历史上的今天:
2019-02-26 delphi假死线程堵塞解决办法
2019-02-26 delphi CheckListBox 添加滚动条
2019-02-26 delphi Timage 加上滚动条方法
2019-02-26 Delphi: TMemo垂直滚动条自动显示
2019-02-26 如何设置Listbox的行间距?
2019-02-26 delphi 如何让ScrollBox的内容与滚动条一起实时滚动
2019-02-26 界面控件 - 滚动条ScrollBar(对滚动条消息和鼠标消息结合讲的不错)

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
好的代码像粥一样,都是用时间熬出来的
点击右上角即可分享
微信分享提示