在我的表单中,我有一个TDBGRid,TDatasource,MessageTable和2按钮。我有一个按钮在我的DBGRID中添加新行:
MessageTable.Append;
MessageTable.Edit;
MessageTable.FieldByName('FieldName').AsString := sName;
MessageTable.Post;
第二个按钮用于删除当前行:
MessageTable.Edit ;
MessageTable.Delete ;
如何确保所有Cell在发布之前不会为空?
如果有一个空的Cell,我需要忽略这一行!
我该怎么做?
答案 0 :(得分:1)
您应该使用数据集(在本例中为TTable)已经为您提供的功能,而不是尝试重新发明轮子。 TDataSet提供专门为此目的而设计的事件(OnBeforePost)。
单击TTable
,然后切换到对象检查器中的“事件”选项卡。找到OnBeforePost
事件并双击它以在代码编辑器中生成事件shell。你会看到这样的事情:
procedure TForm1.Table1BeforePost(DataSet: TDataSet);
begin
// DataSet is the TDataSet (TTable, TQuery, TADOQuery, etc.) to which
// event is attached
end;
在此处将记录实际写入数据库之前,您可以执行所需的所有验证。例如,如果您想确保每个字段中都包含某些内容,则可以执行以下操作:
procedure TForm1.Table1BeforePost(DataSet: TDataSet);
var
i: Integer;
begin
// You can replace DataSet with your actual table variable name, but using it
// this way allows you to use this same event for more than one table if you want.
for i := 0 to DataSet.FieldCount - 1 do
if DataSet.Fields[i].IsNull then
raise Exception.CreateFmt('Field %s has no value', DataSet.Fields[i].FieldName);
end;
如果您想确保只有某些字段具有值,或者该值在某个范围内,您可以直接访问该字段:
procedure TForm1.Table1BeforePost(DataSet: TDataSet);
begin
if DataSet.FieldByName('MyField').IsNull then
Abort; // This silently cancels the post without telling the user
if DataSet.FieldByName('AField').AsInteger = 0 then
raise Exception.Create('AField must not be 0');
end;
现在,您无需在TDBGrid中执行任何操作。如果用户在最后一行点击 DownArrow 并插入了新行,并且输入了不完整或错误的数据,则上述事件将负责处理。如果您使用两个按钮(一个用于插入或编辑,另一个用于发布),它们也可以工作,因为事件将处理其他所有事情。
procedure TForm1.ButtonInsertClick(Sender: TObject);
begin
Table1.Insert; // Or Append - if you have an index on the table they're the same thing
end;
procedure TForm1.ButtonPostClick(Sender: TObject);
begin
Table1.Post; // This is 100% of the code you need here
end;