6
votes

Case à cocher dans un dbgrid

Ma question est de savoir comment définir une colonne dans dbgrid dans Delphi 7, qui sera avec une case à cocher.

Merci d'avance.


5 commentaires

Bonjour, avez-vous essayé de suivre par ex. Ce tutoriel?


@Tlama, si vous postez votre commentaire comme réponse, je voterais.


@Tlama, lien parfait (et bon choix de ne pas en faire une réponse). PA, un lien vers un site externe sans autre contenu (ou contenu sans signification si le lien externe ne fonctionne pas) n'est pas une réponse acceptable ici. Les réponses doivent être autonomes et rester utiles sans autre contenu. Tlamama a pris une décision parfaite. Les réponses externes-link-seules sont généralement marquées et supprimées assez rapidement.


Oui j'ai trouvé ce lien et essayer de la mettre en œuvre. Mais il y a des erreurs de grandes erreurs. J'ai donc changé ma logique dans la source. Mais merci d'avance. Vous devriez le poster comme une réponse et je la définirai comme une.


@Jordan s'il vous plaît non. Vous feriez mieux de vous répondre en expliquant les erreurs que vous avez rencontrées et fournissez votre propre solution. Vous pouvez extraire un représentant et / ou des badges.


4 Réponses :


-3
votes

OK J'ai utilisé Cet article pour mon problème. Ok mais le problème est que cela ne fonctionnait pas comment cela devrait. Donc, je change ma logique dans le code. Et la mettre en œuvre en enregistrant les lignes sélectionnées de la DBGRAD dans une liste.


1 commentaires

IMHO, cela ne vous qualifie pas pour une réponse, mais une modification de la question principale. Peut-être que vous voulez inclure du code pour éclairer comment allez-vous faire des choses ...



1
votes

Si vous utilisez TCLientDataSet + TDataSetProvider + TDataset, vous pouvez manipuler la variante de la matrice de données avant de pouvoir atteindre le clientDataSet et inclure un champ booléen non mis à jour.

Une fois terminé, tout ce dont vous avez besoin est de dessiner sur la grille à l'aide de l'événement ONDRAWCOLUMNCELL. Ici, je n'ai utilisé pas une case à cocher, mais juste un bitmap (lorsque l'utilisateur clique sur elle passe à la sélection / non sélectionné).


0 commentaires

14
votes

La méthode la plus facile et la plus complète telle que testée par moi est la suivante:

dans la section privée de votre unité, déclarez-vous un global pour retenir les options de grille. Il sera utilisé pour la restauration après l'édition de texte désactivée temporaire lors de la saisie de la colonne Case à cocher - comme c'est peut-être l'une des petites erreurs mentionnées par Jordan Borisovin concernant l'article Delphi.about.com EM> P>

procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word;  Shift: TShiftState);
begin
  if ((Self.DBGrid1.SelectedField.DataType = ftBoolean) and (key = VK_SPACE)) then
  begin
    Self.DBGrid1.DataSource.DataSet.Edit;
    Self.DBGrid1.SelectedField.Value:= not Self.DBGrid1.SelectedField.AsBoolean;
    Self.DBGrid1.DataSource.DataSet.Post;   
  end;      
end;


1 commentaires

C'était la réponse qui a fonctionné pour moi. La seule capture que j'ai trouvée était si le champ Cochez la case était la première colonne de la grille. Dans ce cas, les gridorigesOptions ne sont pas initialisées. Fix facile, il suffit d'ajouter des gridoriginoptions: = dbgrid1.Options à la méthode de création du formulaire.



1
votes

Excusez-moi pour avoir posté cela comme réponse, je n'ai pas encore la réputation d'ajouter des commentaires.

La réponse de Mihai Matei est très proche de la solution rare (comme dans vraiment le travail), à l'exception d'un cas d'utilisation où il bugs.

Chaque fois que la première action des utilisateurs sur la grille est de cliquer sur la grille Dans la case Cochez la case, le premier clic fonctionnera, mais la seconde révélera l'éditeur dbgrid sous-jacent.

Cela se produit car le mécanisme "GridoriginalOptionSMechan" doit être initialisé. Pour ce faire, ajoutez simplement le code suivant dans l'événement Onenter de la grille: xxx

c'est ça!


0 commentaires