zoukankan      html  css  js  c++  java
  • 在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

  • 相关阅读:
    排序-计数-优化版
    排序-计数-基础版
    排序-归并
    Unity战斗模块之角色继承设计---1.1
    Unity中保存和读取数据的类---PlayerPrefs
    《计算机图形学》 第一章 基础知识--02向量(二维)
    《计算机图形学》 第一章 基础知识--01下载和安装DirectX,配置VS编辑器
    第四章 002-条件语句
    第四章 001-复合语句
    第三章 004-运算符
  • 原文地址:https://www.cnblogs.com/findumars/p/6359763.html
Copyright © 2011-2022 走看看