1. 程式人生 > >在DBGrid上設定“選擇”欄位,實現勾選功能

在DBGrid上設定“選擇”欄位,實現勾選功能

當資料集有選擇的時候,比如選擇性列印,而且這種選擇是隨使用者的主觀意念決定時。在DBGrid上設定“選擇”欄位,就非常必要和非常有用了。
    在DBGrid上設定“選擇”欄位,操作如下:


    一、加入DB單元,因為要DB相關設定。
uses DB;

    二、在Table的欄位設定一個可供選擇的欄位,例使用中文欄位“選擇”,屬性:bit。

    三、顯示Table的DBGrid中,將該欄位設定為第1列,即DBGrid1.Columns.Items[0]。DBGrid初始化時加入下列程式碼:
DBGrid1.DataSource.DataSet.Fields[0].DisplayLabel:='√';                         //  設定選擇列顯示名稱
DBGrid1.Columns.Items[0].Width:=DBGrid1.Canvas.TextWidth('123');     //  設定選擇列寬度

    四、在DBGrid1CellClick事件中,使用下列程式碼。功能是隻要滑鼠點選“選擇”列,其Boolean值為原值的反值。

procedure TPrintTableFrm.DBGrid1CellClick(Column: TColumn);
begin
  if DBGrid1.SelectedField.DataType=ftboolean then
  begin
    with DBGrid1.DataSource.DataSet do
    begin
      Edit;
      DBGrid1.SelectedField.AsBoolean:=not DBGrid1.SelectedField.AsBoolean;
      Post;
      DBGrid1.Options:=DBGrid1.Options-[dgEditing];
    end;
  end
  else begin
    if DBGrid1.SelectedField.DataType<>ftboolean then
       DBGrid1.Options:=DBGrid1.Options+[dgEditing];
  end;
end;
 

    五、在DBGrid1DrawColumnCell事件中,使用下列程式碼。功能就是重新畫“選擇”列上的字元。

procedure TPrintTableFrm.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;


    六、在DBGrid1TitleClick事件中,使用下列程式碼。功能就是隻要滑鼠點選“選擇”列的標題,可以設定“全選”或“全非”。

procedure TPrintTableFrm.DBGrid1TitleClick(Column: TColumn);
var i:integer;
begin
  if column.Index=0 then                                                         // 驗證是否第一列
  begin
    DBGrid1.DataSource.DataSet.DisableControls;
    DBGrid1.DataSource.DataSet.First;                              // 遊標回滾
    DBGrid1.SelectedRows.CurrentRowSelected:=true;   // 第一行被選中
    if trim(column.Title.Caption)='√' then
    begin
      for i:=0 to dbgrid1.DataSource.DataSet.RecordCount-1 do
      begin
        dbgrid1.Fields[0].DataSet.edit;
        dbgrid1.Fields[0].AsBoolean:=true;
        dbgrid1.Fields[0].DataSet.post;
        dbgrid1.datasource.dataset.next;
      end;
      column.Title.Caption:='×';
    end
    else begin
      for i:=0 to dbgrid1.DataSource.DataSet.RecordCount-1 do
      begin
        dbgrid1.Fields[0].DataSet.edit;
        dbgrid1.Fields[0].AsBoolean:=false;
        dbgrid1.Fields[0].DataSet.post;
        dbgrid1.datasource.dataset.next;
      end;
      column.Title.Caption:='√';
    end;
    DBGrid1.DataSource.DataSet.First;                                       // 遊標回滾
    DBGrid1.SelectedRows.CurrentRowSelected:=true;            // 選中第一行
    DBGrid1.DataSource.DataSet.EnableControls;
  end;
end;

    通過上述程式碼設定,編譯可見效果圖:


---------------------
 
原文:https://blog.csdn.net/lyhoo163/article/details/28108413