2009-06-09 4 views
3

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

Répondre

1

Lorsque vous utilisez deux tables différentes du problème négatif ID est résolu par la relation, modifier ses propriétés et mettez-être une clé étrangère avec des mises à jour en cascade.

Je m'attendrais à ce que cela fonctionne également pour l'auto-référencement, mais c'est difficile.

Sur une note séparée, je pense que vous devriez avoir une BindingSource différente (à la même table) pour la liste déroulante (ou lier sans une BindingSource).

Notez que vous avez d'autres outils disponibles aussi bien, comme adapter.Update (DataRow)

+0

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. –

Questions connexes