2016-08-17 2 views
-2

Dans mon formulaire, j'ai un TDBGRid, TDatasource, MessageTable et 2 bouton. J'ai un bouton pour ajouter une nouvelle ligne dans mon DBGRID:Delphi DBGrid cellule non vide

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

Le second bouton permet de supprimer une ligne de courant:

MessageTable.Edit ; 
MessageTable.Delete ; 

Comment assurer que toutes les cellules non vides avant que le poste?

S'il y a une cellule vide, j'ai besoin d'ignorer cette rangée!

comment puis-je faire cela?

+1

Vous n'avez pas besoin de la ligne d'édition. Après l'ajout, la table est dans l'état dsinsert et vous pouvez assigner des valeurs. Vous n'avez pas non plus besoin de définir la table dans l'état dsedit avant de supprimer –

+1

Veuillez préciser votre problème: vous pouvez remplir tous les champs de l'événement beforepost ou définir des champs avec des valeurs prédéfinies dans l'événement afterinsert. Que signifie cellule vide? vous pouvez exclure des enregistrements de données de la grille dans l'événement ondrawdatacell ou vous pouvez vérifier l'événement beforepost si tous les champs sont remplis (<> NULL dépend de votre base de données) –

+1

** J'ai un bouton pour ajouter une nouvelle ligne dans mon DBGRID : ** Vous pouvez utiliser ce 'bouton OnClick event' faire toute la validité des données. 'Aucune donnée valide' non' MessageTable.Append' ..... Pourquoi appeler 'MessageTable.Append' avec des données non valides? Et l'attraper dans 'événement beforePost 'inutile. –

Répondre

1

Vous devez utiliser les fonctionnalités que l'ensemble de données (dans ce cas, TTable) vous donne déjà au lieu d'essayer de réinventer la roue. TDataSet fournit un événement (OnBeforePost) spécialement conçu à cet effet.

Cliquez sur votre TTable, puis basculez vers l'onglet Evénements dans l'inspecteur d'objets. Recherchez l'événement OnBeforePost et double-cliquez dessus pour générer le shell d'événements dans l'éditeur de code. Vous verrez quelque chose comme ceci:

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

Vous pouvez faire toutes vos validations nécessaires avant qu'un enregistrement est en fait écrit à la base de données ici. Par exemple, si vous voulez vous assurer que chaque champ unique a quelque chose, vous pouvez le faire:

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; 

Si vous voulez vous assurer que seuls certains champs ont des valeurs, ou que la valeur est dans une certaine plage , vous pouvez accéder au champ directement:

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; 

maintenant, vous ne devez pas faire quoi que ce soit dans votre TDBGrid. Si l'utilisateur tape DownArrow sur la dernière ligne et qu'une nouvelle ligne est insérée, et qu'ils entrent des données incomplètes ou erronées, les événements ci-dessus s'en occuperont. Ils fonctionneront également si vous utilisez deux boutons (un pour insérer ou modifier et l'autre pour publier), car les événements géreront tout le reste.

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;