Delphi DBGrid ячейка не пустая

В моей форме у меня есть TDBGRid, TDatasource, MessageTable и 2. У меня есть кнопка для добавления новой строки в мой DBGRID:

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

Вторая кнопка используется для удаления текущей строки:

MessageTable.Edit ;
MessageTable.Delete ;

Как обеспечить, чтобы все ячейки не были пустыми до публикации?

Если есть пустая ячейка, мне нужно игнорировать эту строку!

Как мне это сделать?

database,delphi,dbgrid,

-2

Ответов: 1


1

Вы должны использовать функции, которые набор данных (в данном случае, TTable) уже дает вам вместо того, чтобы пытаться изобрести колесо. TDataSet предоставляет событие (OnBeforePost), специально разработанное для этой цели.

Нажмите на свой TTable, а затем перейдите на вкладку «События» в «Инспекторе объектов». Найдите OnBeforePostсобытие и дважды щелкните его, чтобы сгенерировать оболочку событий в редакторе кода. Вы увидите что-то вроде этого:

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;
базы данных, Дельфы, DBGrid,
Похожие вопросы