焦点进入一列后即使未做修改也强制触发 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

浙公网安备 33010602011771号