如何在一个DBGrid里加入一个按扭列或复选框列?

解决方案 »

  1.   

    DBGrid的列的PickList属性
    你试一下就知道了!
      

  2.   

    复选框什么效果?是checkbox的效果吗?想象不出。楼主强。
    combobox倒是很容易。
      

  3.   

    给个例子参考参考(未调试)
    用API函数 
    DrawFrameControl()直接画出CHECKBOX
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, DB, DBTables, Grids, DBGrids, ExtCtrls, DBCtrls;type
      TForm1 = class(TForm)
        DBGrid1: TDBGrid;
        DataSource1: TDataSource;
        Table1: TTable;
        DBNavigator1: TDBNavigator;
        Table1ID: TAutoIncField;
        Table1XM: TStringField;
        Table1XB: TStringField;
        Table1XH: TSmallintField;
        Table1SZXB: TStringField;
        Table1RXSJ: TDateField;
        Table1SFDY: TBooleanField;
        procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
          DataCol: Integer; Column: TColumn; State: TGridDrawState);
        procedure DBGrid1ColEnter(Sender: TObject);
        procedure DBGrid1ColExit(Sender: TObject);
        procedure DBGrid1CellClick(Column: TColumn);
        procedure DBGrid1KeyDown(Sender: TObject; var Key: Word;
          Shift: TShiftState);
      private
        { Private declarations }
        OriginalOptions : TDBGridOptions;
        procedure SaveBoolean;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    const
      // 这个整数值将按照布尔值返回,并送入数组
      CtrlState : array[Boolean] of Integer = (DFCS_BUTTONCHECK,
                                            DFCS_BUTTONCHECK or DFCS_CHECKED);
    begin
     //确保只有在逻辑字段才能插入组件
      if Column.Field.DataType = ftBoolean then
        begin
          DBGrid1.Canvas.FillRect(Rect);
          DrawFrameControl(DBGrid1.Canvas.Handle,
                             Rect,
                             DFC_BUTTON,
                             CtrlState[Column.Field.AsBoolean]);
         end;
    end;procedure TForm1.DBGrid1ColEnter(Sender: TObject);
    begin
     // 确保该栏是逻辑字段
      if DBGrid1.SelectedField.DataType = ftBoolean then
        begin
          OriginalOptions := DBGrid1.Options;
          DBGrid1.Options := DBGrid1.Options - [dgEditing];
        end;
      end;
    procedure TForm1.DBGrid1ColExit(Sender: TObject);
    begin
    //确保该栏是逻辑字段
      if DBGrid1.SelectedField.DataType = ftBoolean then
        DBGrid1.Options := OriginalOptions;
    end;procedure TForm1.DBGrid1CellClick(Column: TColumn);
    begin
    //确保该栏是逻辑字段
      if DBGrid1.SelectedField.DataType = ftBoolean then
        SaveBoolean();
    end;procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
    //确保该栏是逻辑字段和空格键在键盘中被敲击
      if ( Key = VK_SPACE ) and
        ( DBGrid1.SelectedField.DataType = ftBoolean ) then
        SaveBoolean();
    end;
    procedure TForm1.SaveBoolean;
    begin
      DBGrid1.SelectedField.Dataset.Edit;
      DBGrid1.SelectedField.AsBoolean :=
        not DBGrid1.SelectedField.AsBoolean;
      DBGrid1.SelectedField.Dataset.Post;
    end;end.