焦点进入一列后即使未做修改也强制触发 OnValidate 事件(原创)

在默认情况下,OnValidate 事件只有在用户修改了数值后才会触发,如果用户只是移入焦点到一列,未做修改,则不会触发该事件。如果某一列要求不可以为空,那么如何在插入新的数据行后,检验用户是否输入了值呢?可以设置该列的内嵌编辑控件的 ModifiedAfterEnter 属性为 True 来实现。不过需要注意的是,该属性必须在 cxView 的 OnInitEdit 事件初始化该列的内置编辑控件后设置,但如果在 OnInitEdit 事件中设置 ModifiedAfterEnter 属性,过一会之后该属性又会变成 False。更好的办法是自定义一个消息处理函数来实现。

const
  CM_SHOWNEDITOR = WM_USER + 1;

type
  TfrmAddOrder = class(TForm)
    procedure CmShownEditor(var Msg: TMessage); message CM_SHOWNEDITOR;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

// cxView 的 InitEdit 事件,当进入指定的列时,发送自定义消息
procedure TfrmAddOrder.cvAddOrderInitEdit(Sender: TcxCustomGridTableView;
  AItem: TcxCustomGridTableItem; AEdit: TcxCustomEdit);
begin
  if AItem = clCaption then
    PostMessage(Handle, CM_SHOWNEDITOR, Integer(AEdit), 0);
end;

// 消息响应,设置该列的 ModifiedAfterEnter 属性为 True
procedure TfrmAddOrder.CmShownEditor(var Msg: TMessage);
begin
  if TObject(Msg.WParam) is TcxCustomEdit then begin
    //ExpressQuantumGrid v6 必须在设置 ModifiedAfterEnter 属性前先调用该内嵌控件的 DoEditing 方法,否则编辑内容无法提交
    TcxCustomEdit(Msg.WParam).DoEditing;
    TcxCustomEdit(Msg.WParam).ModifiedAfterEnter := True;
  end;
end;

procedure TfrmAddOrder.clCaptionPropertiesValidate(Sender: TObject;
  var DisplayValue: Variant; var ErrorText: TCaption; var Error: Boolean);
begin
  if VarIsNull(DisplayValue) or (Trim(DisplayValue) = '') then begin
    ErrorText := '必须输入品名';
    Error := True;
  end;
end;

参见:
How to force the in-place editor to trigger the OnValidate even when nothing has been changed

posted @ 2024-08-02 06:15  汉学  阅读(14)  评论(0)    收藏  举报