在TDBGrid中绘制一个多选框(CheckBox)

可在TDBGrid的OnDrawColumnCell和OnDrawDataCell事件中编写

void __fastcall TForm1::DBGrid1DrawColumnCell(TObject *Sender,
      const TRect &Rect, int DataCol, TColumn *Column,
      TGridDrawState State)
{
    if (Column->FieldName == "Visible")
    {
        TDBGrid *grid = dynamic_cast<TDBGrid *>(Sender);
        unsigned int uState = DFCS_BUTTONCHECK;
        if (Column->Field->AsBoolean)  uState += DFCS_CHECKED;
        TRect FrameRect = TRect(Rect.left+2,Rect.top+2,Rect.right-2,Rect.bottom-2);
        //也可以直接=Rect,不过画出来的单选框有点偏大 
        DrawFrameControl(grid->Canvas->Handle,&FrameRect,DFC_BUTTON,uState);
    }
}
(在OnDrawDataCell中需要更改Column参数为Field)

说明:这仅仅是在TDBGrid中绘制一个CheckBox形状,这个CheckBox并不会响应鼠标点击事件,但会根据字段值改变选择状态,所以还必须自己编写事件改变字段值,可以在OnCellClick事件中改变字段值,比如:

void __fastcall TForm1::DBGrid1CellClick(TColumn *Column)
{
    TDBGrid *grid = dynamic_cast<TDBGrid *>(Column->Grid);

    if (Column->FieldName == "Visible") {
        Column->Field->DataSet->Edit();
        Column->Field->AsBoolean = !Column->Field->AsBoolean;
        Column->Field->DataSet->Post();
    }
}

同时,为了不在Cell内显示字段本身的值(True或False),也就是不管什么值都显示空白,必须这样

((TBooleanField *)Column->Field)->DisplayValues=";";

也可以在设计时更改(ADOTable的Fields Editor中),是TBooleanField字段才会有DisplayValues属性,如果你这个字段不是Boolean型,这样的转换可能会有错误。

另外,这和其他的绘制功能不太一样(比如更改字体颜色),一定不能在后面加上DefaultDrawColumnCell或DefaultDrawDataCell,要不然就白画啦,可以加在前面。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页
评论

打赏作者

编译失败

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值