Situation:C#: Comment gérer les "auto-références" pour les tables dans DataGridView?
Dans ma base de données J'ai une table dans laquelle des documents peuvent faire référence à d'autres enregistrements de la même table. Chaque enregistrement a un ID numérique unique (colonne auto-ID) et une colonne NULL IDRef
qui peut contenir l'ID de l'enregistrement à référencer. Maintenant, dans mon application C# Windows Forms j'utilise un DataGridView pour permettre à l'utilisateur de modifier les enregistrements dans la table. Il peut ajouter, modifier ou supprimer des éléments. J'ai un DataSet typé pour contenir les données et un TableAdapter correspondant pour charger les données de la base de données et effectuer des mises à jour. DataGridView est lié à un BindingSource qui utilise le DataSet typé comme source de données.
Pour la colonne IDRef
, j'ai ajouté une colonne ComboBox qui remplit ses valeurs à partir du même BindingSource que le DataGridView lui-même. Cela signifie que le ComboBox est toujours à jour avec le nombre d'enregistrements.
Problème:
J'afficher la colonne ID
dans le DataGridView. Lorsque vous ajoutez de nouvelles lignes en cliquant sur la ligne correspondante de DataGridView, la valeur de l'ID est automatiquement remplie avec des valeurs négatives. La valeur d'auto-ID finale est calculée uniquement après la persistance des modifications apportées à la base de données à l'aide de TableAdapter. Maintenant, quand je descends la ComboBox pour la colonne IDRef
, je peux sélectionner les enregistrements existants (par exemple 101, 102, etc.), mais je peux aussi sélectionner les enregistrements qui ont été ajoutés après la dernière mise à jour de la colonne. base de données (par exemple -1, -2, -3). Maintenant: après avoir utilisé la méthode Update
de TableAdapter pour conserver les modifications dans la base de données, ces identifiants négatifs n'existent plus - Je référence des enregistrements inexistants (dans mon cas cela entraîne une erreur de contrainte de clé étrangère) .
Solution?
Ce que je fait est:
- Utilisez seconde DataSet et BindingSource pour la colonne ComboBox
- Ajouter un bouton « Appliquer » qui met à jour les modifications apportées à la base de données en utilisant le TableAdapter
- Relisez les données dans le second DataSet lié à la colonne ComboBox
Ceci permet de s'assurer que l'utilisateur ne peut sélectionner que les valeurs qui ont été conservées dans la base de données b y en appuyant sur le bouton "Appliquer".
Existe-t-il un moyen plus élégant que celui de gérer ces "auto-références" dans les tables en utilisant le contrôle DataGridView?
EDIT: Modification des balises pour mieux répondre aux sujets
Oui, actuellement j'ai une deuxième DataSet et BindingSource pour le combo. Cela fonctionne bien - seulement je dois appuyer sur le bouton "Appliquer" avant de pouvoir sélectionner quoi que ce soit. C'est pourquoi je me demande s'il y a une approche plus élégante. –