在delphi中如何实现cxGrid控件一个单元格显示多个操作按钮

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在delphi中如何实现cxGrid控件一个单元格显示多个操作按钮相关的知识,希望对你有一定的参考价值。

这个功能目前是jsp做的,我们delphi能够做出这种效果吗,或者说相近的效果

删掉默认的 View,用 BandTableView。
放3个ImageComboBox追问

能够加我吗,我觉得你说的太简略了,我不太懂。513005380

参考技术A 能实现,不过估计图片填加不进去追问

具体怎么实现啊,高手,指导一下啥。你说一下你的号嘛,我加你,行不

cxGrid自动保存当前单元格输入的数据

遇到的问题,利用cxGrid做数据录入界面,当用户在一个单元格中录入数据,没有回车,然后直接点工具条上的保存按钮,执行数据提交,结果当前输入的内容丢掉了,又回到输入前的值。

在群中求助,得到好多朋友的支持,这里先感谢了,最终明白大家的说法,并成功解决掉了这个问题。

在这种情况下,与cxGrid的实现机制有关系,也就是说,点击工具条上的按钮,没有发生焦点变换,这时候cxGrid认为自己的用户没有输入完成,继续等用户输入。

理解了这种情况,有一种解决方法,就是在点保存按钮时,强制调用Self.SetFocus,这里Self指Form;另外一种解决方法,就是调用cxGrid提供方法,强制提交数据。

看下面的代码,按大家的提法,有很多写法:

procedure Tsys_AddressBTDoc.UpdateData(aTableView: TcxGridDBTableView);
var
  AValue:Variant;
begin
  if aTableView.DataController.IsEditing then
  begin
    //这是一种方法
    //AValue:=TcxCustomTextEdit(aTableView.DataController.Controller.EditingController.Edit).Text;
    //aTableView.dataController.DataSet.Edit;
    //aTableView.dataController.DataSet.FieldByName(‘fname‘).AsString:=AValue;
    //aTableView.dataController.DataSet.Post;

    //这是一种方法
    //aTableView.Controller.EditingController.HideEdit(True);

    //这是一种方法
    //aTableView.Controller.EditingController.Edit.PostEditValue;

    //这是一种方法
    //aTableView.dataController.DataSet.Post;

    //这是一种方法
    aTableView.dataController.UpdateData;
  end;
end;

参数是cxGrid的一个视图。如下图,指ShiTableView。

技术图片

 

 

当点击保存按钮,执行这个方法,强制cxGrid提交数据。

UpdateData(ShiTableView);

写出这样的结果,看似简单,我确用了好几个小时,因为产生一种现象,就是用户第一次输入,执行上面的动作,数据得不到保存,第二次及以后则正常。最后查明,原来我的ShiTableView还使用了事件:ShiTableViewFocusedRecordChanged

在这个事件上,我做了调入其他cxGrid需要的数据,正是这个事件造成第一次执行错误。用代码在执行UpdateData前去掉这个事件,执行后再恢复事件。最终的代码变成这样:

procedure Tsys_AddressBTDoc.actSaveExecute(Sender: TObject);
begin

  DisableFocusedRecordChanged;
  try
     //Self.SetFocus;//这是一种强制保存当前cxGrid输入的内容的方法
     UpdateData(ShiTableView); //这是一种强制保存当前cxGrid输入的内容的方法
     Save;
  finally
     EnableFocusedRecordChanged;
  end;

end;

最终,还有一点要说明,SetFocus与UpdateData的区别:

如果用SetFocus,会使cxGrid没有了焦点,用户要继续操作cxGrid,就需要mouse点击一下,让cxGrid重新得到焦点,对于连续输入来说,不方便。而UpdateData方法,要写更多的代码,使得代码偶合增加,有利有憋,自己把握了!我最后用的UpdateData方法。

这是最后完成的界面:

技术图片

 

再一次感谢群友们的指导与帮助!

 

以上是关于在delphi中如何实现cxGrid控件一个单元格显示多个操作按钮的主要内容,如果未能解决你的问题,请参考以下文章

delphi中,cxgrid怎样将选中的单元格都赋为选中的第一行的值,并且数据集也同步更新

delphi cxgrid 控件如可实现展开一行记录看其明细

delphi cxgrid控件中自定义筛选,用like时,要加% %才能实现模糊查询,如何不要输入% %就能实现。

delphi DBgridEh多行单元格如何实现~急!!

delphi10 cxgrid控件怎么啦出来

delphi cxgrid 列内容 中心对齐如何实现