delphi DBGrid单元格不为空

时间:2016-08-17 16:50:53

标签: database delphi dbgrid

在我的表单中,我有一个TDBGRid,TDatasource,MessageTable和2按钮。我有一个按钮在我的DBGRID中添加新行:

MessageTable.Append;
MessageTable.Edit;
MessageTable.FieldByName('FieldName').AsString  :=  sName;
MessageTable.Post;

第二个按钮用于删除当前行:

MessageTable.Edit ;
MessageTable.Delete ;

如何确保所有Cell在发布之前不会为空?

如果有一个空的Cell,我需要忽略这一行!

我该怎么做?

1 个答案:

答案 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;