我想哭这个问题问了若干遍,一直没人给出正确的解答.
  我有一个数据表有两字段(姓名,婚姻状况)其中婚姻状况为逻辑性字段  我想用Dbgrid显示它时达到如此效果:      如果婚姻状况为true时,在Dbgrid中的婚姻状况位置用Dbcheckbox表示并且打勾
      否则如果婚姻状况为false时,在Dbgrid中的婚姻状况位置用Dbcheckbox表示并且不打勾

解决方案 »

  1.   

    下载:http://www.vclxx.org/DELPHI/D32FREE/CHECKDBGRID.ZIP
    加强版 TDBGrid 构件,除了能够立体显示外,当数据字段为布耳值时会以 Checkbox 形式显示 ( 0.9 版,附源码 ),作者 : Michael Peter。 
      

  2.   

    也可以利用变向的手法,用StringGrid代替DBGrid,然后根据需要在StringGrid的画布上画,总觉的StringGrid的用处的确不小;你可以试一试的
      

  3.   

    给你参考。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.
      

  4.   

    用dxDbgrid就可以了!不用写代码就可以满足你的要求了!
      

  5.   

    由本书上有个例子,但是没带过来,自己试了一下!先在数据集中加入所有字段对象,然后在DBGRid里也将需要显示的字段显示出来,当然包括婚姻状况字段,假如其字段为'Marry',加入一个dbcheckbox1对象,设置其datasource,datafield,caption='marry'('婚姻'也行),并将其visible设为false,color可设为白色。
    然后再dbgrid的DrawColumnCell事件里这样写:
      if (gdfocused in state) and (column=dbgrid1.columns[2]) then//这里是marry字段在//dbgrid中列数。
      begin
        dbcheckbox1.Visible:=true;
        dbcheckbox1.SetBounds(rect.left+dbgrid1.left,rect.top+dbgrid1.top,rect.right-    rect.left,rect.bottom-rect.top);
      end;
    这样应该差不多了,你试试吧!
      

  6.   

    再加上一个事件:
    procedure TForm1.DBGrid1ColExit(Sender: TObject);
    begin
      if DBGrid1.SelectedField.DataType = ftBoolean then
        dbcheckbox1.visible:=false;
    end;
      

  7.   

    你搜索一下有关在dbgrid中加入可视化控件的文章吧,
    或者干脆下载一个新控件算了。
      

  8.   

    用第三方控件:Infopower3000中的TWWDBGRID来做,不需要写任何麻烦的代码就可以了
      

  9.   

    可以在query等控间的字端编辑器的OnGetText属性里写代码
    双击TQuery控间就可以打开字段编辑器了
    比如 
    procedure TForm.QueryGetText(
      Sender: TField; var Text: String; DisplayText: Boolean);
    begin
      if DisplayText then
        DBCheckBox.Checked := Sender.AsBoolean;
    end;
    很简单把
      

  10.   

    这个问题很简单呀,你在dbgrid中加DBCheckBox,然后把数据集的连接弄好就行了!!!
    有问题请发信息到我的E-mail:[email protected]