【问题标题】:In DevExpress' Quantum Grids, how do I restrict the click area of a cell with checkbox to the actual checkbox, not the entire cell在 DevExpress 的量子网格中,如何将带有复选框的单元格的单击区域限制为实际的复选框,而不是整个单元格
【发布时间】:2010-09-24 13:28:09
【问题描述】:

我使用 Delphi (2010) 和 DevExpress Quantum Grid (v. 6.52)

当我有一个带有 CheckBox 编辑器的 TcxGridColumn 时,当用户单击单元格内的任意位置时,复选框会切换。我想限制这一点,以便用户必须点击实际的复选框。

有没有简单的方法来做到这一点?我们的应用程序中有大量的网格,其中许多带有复选框编辑器,所以我希望有一个“神奇”的小技巧来为我做这件事。我不想为我们应用程序中的每个网格编写自定义代码:-/

【问题讨论】:

  • 为什么,哦,你为什么要这样做?为什么你想让你的应用程序更难使用?许多用户远没有大多数程序员那样擅长使用鼠标。为什么你认为 MS 让所有窗口的标题栏和“x”关闭按钮比 Win2K 更大?
  • 我想这样做是因为这是我们客户的直接请求。他们发现像现在这样无意地切换复选框太容易了。有时他们单击一个单元格只是为了关注特定的行,甚至没有注意到他们已经更改了它!为什么复选框在网格中的工作方式与在表单中的方式不同?所以总而言之,我完全不同意你的观点:-)

标签: delphi devexpress


【解决方案1】:

如果您(或您的客户)希望在单击单元格时复选框不会立即更改,那么将ImmediatePost 属性设置为false 会有所帮助。

【讨论】:

  • 不,这没有任何区别。复选框仍然会切换,一旦用户离开单元格,值就会被发布。
【解决方案2】:

也许不是您正在寻找的确切答案,但也许它满足您的客户要求。

对于 cxGrid 中的每个单元格,您可以打开或关闭 ImmediateEditor 属性。此属性确定在单击适当的单元格后是否立即激活特定的列编辑器。

来自 cxGrid 版本 6 的帮助文件:

属性 ImmediateEditor:布尔值;

说明

使用 ImmediateEditor 属性来确定当用户单击适当的单元格时是否激活特定的列编辑器。如果此属性值为 False,则当焦点位于特定单元格内时,通过按 Enter 键激活网格单元格编辑器。

【讨论】:

  • 这确实使无意中切换复选框变得更加困难,并且它将解决人们单击一行只是为了设置焦点的问题,但它会改变整个网格的行为,而不仅仅是复选框.
  • 但这保持处理一致!您正在尝试引入一个行为不同的特殊单元格/编辑器。也许是时候进行客户培训了!? ;-)
  • 我很乐意,但我们的客户很少,我们不能冒险疏远他们:-)
【解决方案3】:

我向 DevExpress 发送了与支持请求相同的问题,我得到了这个答案:

“你好斯文。

感谢您的留言。您可以使用 GridView 的 OnMouseDown 事件处理程序并在那里检查命中信息来实现所需的结果。 附件是显示如何执行此任务的示例。请尝试此解决方案,并让我们知道您的结果。”

测试项目有一个带有复选框列的简单网格。 GridView 的 OnMouseUp 事件代码如下:

procedure TForm1.cxGrid1TableView1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  AHitTest: TcxCustomGridHitTest;
  ACellViewInfo: TcxGridDataCellViewInfo;
  AEditViewInfo: TcxCustomCheckBoxViewInfo;
  ARect: Trect;
  AValue: Variant;
begin
   AHitTest := TcxGridSite(Sender).GridView.GetHitTest(X, Y);
   if AHitTest is TcxGridRecordCellHitTest then
   begin
     ACellViewInfo := TcxGridRecordCellHitTest(AHitTest).ViewInfo as TcxGridDataCellViewInfo;
     if ACellViewInfo.EditViewInfo is TcxCustomCheckBoxViewInfo then
     begin
       AEditViewInfo := TcxCustomCheckBoxViewInfo(ACellViewInfo.EditViewInfo);
       ARect := AEditViewInfo.CheckBoxRect;
       if PtInRect(ARect, Point(X, Y)) then
       begin
         AValue := ACellViewInfo.GridRecord.Values[ACellViewInfo.Item.Index];
         TcxGridTableView(TcxGridSite(Sender).GridView).DataController.SetEditValue(
           ACellViewInfo.Item.Index, AValue = false, evsValue);
       end;
     end;
   end;
end;

不幸的是,由于 MouseUp 事件是在网格上而不是在列上,我无法为我的复选框列创建存储库项,但至少现在我知道了一种方法。

【讨论】:

  • 那绝对是最好的提问地点。 DevExpress 的支持非常出色!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-06
  • 1970-01-01
  • 1970-01-01
  • 2019-06-06
  • 2021-02-03
  • 2017-10-08
  • 2012-04-02
相关资源
最近更新 更多