Delphi DBGrid上设置选择项


本文整理自网络,侵删。

 
当数据集有选择的时候,比如选择性打印,而且这种选择是随用户的主观意念决定时。在DBGrid上设置选择项,就非常必要和非常有用了。
    在DBGrid上设置选择项,操作如下:


    一、加入DB单元,因为要DB相关设置。
uses DB;

    二、在Table的字段设置一个可供选择的字段,例使用中文字段“选择”,属性:bit。

    三、显示Table的DBGrid中,将该字段设置为第1列,即DBGrid1.Columns.Items[0]。DBGrid初始化时加入下列代码:
DBGrid3.DataSource.DataSet.Fields[0].DisplayLabel:='√';          //  设置选择列显示名称
DBGrid3.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/28108807

相关阅读 >>

Delphi的常用条件编译指令

Delphi 模似键盘输入又一方法

Delphi spcomm的一些用法注意

如何为Delphi程序添加事件和事件处理器

Delphi 去掉警告

Delphi获取uri的查询参数

Delphi读取radiogroup选中按钮的string文本

Delphi 密码框写完后按enter直接登录

Delphi 获取文件夹路径最后一级文件夹目录名称

删除Delphi组件tstringlist中的重复项目

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...