2016-08-17 4 views
-2

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

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

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

MessageTable.Edit ; 
MessageTable.Delete ; 

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

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

как я могу это сделать?

+1

Вам не нужна строка «Редактировать». После добавления таблица находится в состоянии dsinsert, и вы можете назначить значения. Вам также не нужно устанавливать таблицу в состоянии dsedit перед удалением. –

+1

. Будьте более конкретными в своей проблеме: вы можете заполнить все поля в событии beforepost или задать поля для предопределенных значений в событии afterinsert. Что означает пустая ячейка? вы можете исключить записи данных из сетки в событии ondrawdatacell или вы можете проверить событие beforepost, если все поля заполнены (<> NULL зависит от вашей базы данных) –

+1

** У меня есть кнопка, чтобы добавить новую строку в мой DBGRID : ** Вы можете использовать это 'button OnClick event', чтобы сделать всю достоверность данных. 'No valid Data' no' MessageTable.Append' ..... Зачем вызывать 'MessageTable.Append' с недопустимыми данными? И поймать его в событии beforePost бессмысленно. –

ответ

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; 
Смежные вопросы