2016-08-17 5 views
-2

In meinem Formular habe ich eine TDBGRid, TDatasource, MessageTable und 2-Taste. Ich habe eine Schaltfläche, um neue Zeile in meinem DBGRID hinzufügen:Delphi DBGrid Zelle nicht leer

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

Die zweite Schaltfläche, um eine aktuelle Zeile löschen verwendet wird:

MessageTable.Edit ; 
MessageTable.Delete ; 

Wie kann alle Handys nicht leer ist, bevor die Post gewährleisten?

Wenn es eine leere Zelle gibt, muss ich diese Zeile ignorieren!

Wie kann ich das tun?

+1

Sie benötigen die Zeile Bearbeiten nicht. Nach dem Anfügen befindet sich die Tabelle im Status "dsinsert" und Sie können Werte zuweisen. Sie müssen die Tabelle auch nicht im dsedit-Zustand vor dem Löschen setzen. –

+1

Bitte konkretisieren Sie Ihr Problem: Sie können alle Felder im Vorpost-Ereignis füllen oder im After-Event-Ereignis Felder auf vordefinierte Werte setzen. Was bedeutet leere Zelle? Sie können Datensätze aus dem Grid im Ereignis ondrawdatacell ausschließen oder Sie können das Vorpost-Ereignis einchecken, wenn alle Felder ausgefüllt sind (<> NULL hängt von Ihrer Datenbank ab) –

+1

** Ich habe eine Schaltfläche zum Hinzufügen einer neuen Zeile in meinem DBGRID : ** Sie können dieses 'Knopf OnClick-Ereignis' verwenden, um die Gültigkeit der Daten zu übernehmen. 'No valid Data' no 'MessageTable.Append' ..... Warum' MessageTable.Append' mit ungültigen Daten aufrufen? Und fangen Sie es in 'beforePost event' sinnlos ab. –

Antwort

1

Sie sollten die Funktionen verwenden, die der Datensatz (in diesem Fall TTable) Ihnen bereits gibt, anstatt zu versuchen, das Rad neu zu erfinden. TDataSet stellt ein Ereignis (OnBeforePost) bereit, das speziell für diesen Zweck entwickelt wurde.

Klicken Sie auf Ihre TTable, und wechseln Sie dann im Objektinspektor zur Registerkarte Ereignisse. Suchen Sie das Ereignis OnBeforePost und doppelklicken Sie darauf, um die Ereignisshell im Quelltext-Editor zu generieren. Sie werden etwas sehen:

procedure TForm1.Table1BeforePost(DataSet: TDataSet); 
begin 
    // DataSet is the TDataSet (TTable, TQuery, TADOQuery, etc.) to which 
    // event is attached 
end; 

Sie können vor einem Datensatz benötigt, um alle Ihre Validierungen tun, ist hier in die Datenbank tatsächlich geschrieben. Zum Beispiel, wenn Sie jedes einzelne Feld hat etwas in ihm, um sicherzustellen, möchten, können Sie dies tun:

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; 

Wenn Sie sicher, dass nur bestimmte Felder Werte machen wollen, oder dass der Wert innerhalb eines bestimmten Bereichs , können Sie das Feld direkt zugreifen:

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; 

Jetzt nicht haben Sie etwas überhaupt in Ihrem TDBGrid zu tun. Wenn der Benutzer DownArrow in der letzten Zeile trifft und eine neue Zeile eingefügt wird und sie unvollständige oder falsche Daten eingeben, werden die obigen Ereignisse dafür sorgen. Sie funktionieren auch, wenn Sie zwei Schaltflächen verwenden (eine zum Einfügen oder Bearbeiten und die andere zum Posten), da die Ereignisse alles andere behandeln.

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; 
Verwandte Themen