2008-10-07 9 views
1

J'ai un DataGridViewComboBoxColumn dans un DataGridView dans une application Windows. L'utilisateur peut modifier des paramètres ailleurs pour potentiellement invalider une sélection dans un DataGridViewComboBoxColumn. J'ai l'obligation de conserver/afficher l'élément invalide en ne laissant que des éléments valides sélectionnables dans la liste.Afficher une valeur par défaut non valide dans un DataGridViewComboBoxColumn

Sans corriger la sélection, une exception est levée:
La valeur DataGridViewComboBoxCell n'est pas valide. Attraper et ignorer le réglage rétablit la valeur sélectionnée au premier élément valide de la liste.

Existe-t-il un moyen de fournir une valeur à DataGridViewComboBoxColumn afin qu'il n'apparaisse pas dans la liste des valeurs sélectionnables?

+0

Connaissez-vous les événements CellValidating et DataError? Ce dernier peut supplanter l'exception que DataGridView lance. –

+0

J'ai attrapé l'exception et je l'ai ignorée (un motif malheureusement commun) et la valeur est revenue. Si vous avez des suggestions, je suis tout ouïe ... euh ... les yeux? – BrianH

Répondre

1

Je vais utiliser un exemple que les valeurs dans la liste déroulante sont des couleurs, et le DataGridView a une liste de t-shirts dans votre placard.

Avez-vous essayé d'insérer la couleur non valide dans l'objet de liste lié à la colonne ComboBox? Peut-être que vous pouvez insérer quelque chose dans la liste dont la clé correspond à votre couleur invalide, mais montre "(Invalid)" (ou un autre texte similaire). Vous devriez répondre à l'événement CellValidating si quelqu'un essayait de le choisir après votre liaison initiale.

Si les couleurs invalides viennent en modifiant une recherche ailleurs dans l'application afin que les valeurs de DataGridView (les t-shirts) ne soient plus valides, vous avez quelques options. Peut-être que vous pourriez changer cette logique pour rechercher les données qui vont à la liste des t-shirts et voir s'il y a des t-shirts avec cette couleur - puis inviter l'utilisateur à dire "Vous avez désactivé Red, mais vous avez T-shirts rouges, que voulez-vous faire? " Vous pouvez arrêter de désactiver Red, changer les T-shirts ou supprimer les T-shirts. Si les couleurs non valides proviennent d'une source que vous ne contrôlez pas, vous pouvez demander à l'utilisateur lorsqu'il essaie de regarder la liste des t-shirts, "Le rouge n'est plus une couleur valide pour les T-shirts, ce que est-ce qu'on fait avec les t-shirts rouges?

Nous avons une contrainte similaire dans notre application. Nous avons abandonné les listes déroulantes et utilisé CellValidating à la place.

+0

Merci pour la réponse. Peaufiner votre exemple, nous gardons la trace de la couleur de la chemise et de la couleur du pyjama pour les X derniers jours. Plusieurs couleurs peuvent être supprimées/rendues invalides à la fois. Actuellement, nous réinitialisons simplement la liste à un état non sélectionné avec uniquement des valeurs valides sélectionnables. Le problème est que l'utilisateur ne sait plus quelle couleur était portée certains jours (alors que si nous pouvions montrer des entrées invalides, ils pouvaient voir qu'ils portaient du rouge le jour 6 et du bleu le jour 12) alors que le rouge et le bleu ne le sont plus valide. – BrianH

+0

L'aspect historique de ceci est très intéressant. Cela fait-il partie de votre logique d'entreprise? Si oui, vous ne voulez pas qu'ils changent l'histoire non plus, n'est-ce pas? Donc, vous avez un problème très difficile sur vos mains. Je pense que le problème serait mieux résolu avec une colonne personnalisée, honnêtement. Idéalement, vous auriez accès à l'histoire à partir d'une certaine date. Ensuite, lorsque la zone de liste déroulante est affichée, vous pouvez afficher uniquement les couleurs qui étaient actives à cette date. Si vous n'avez pas accès à l'historique, ne montrez même pas de liste déroulante, surtout si elle est historique. – JJO

+0

Ce n'est pas vraiment une histoire, ça correspond juste à l'exemple. Peut-être que c'est les chemises que vous voulez porter pour le reste de la semaine. Ou un plan de repas, mais vous ne pouvez pas avoir des céréales ou des crêpes maintenant parce que le lait a mal tourné. Longue histoire courte: ce qui était autrefois valide a maintenant été enlevé. Afin de planifier de nouvelles options, vous devez idéalement savoir quelles étaient les anciennes options pour les remplacer. Comme c'est pour une application métier, vous devez savoir que l'ancienne valeur était A, vous pouvez donc la remplacer par C, cette autre ancienne valeur était B, donc vous pouvez la remplacer par D excepté la 3ème instance, où vous auriez aussi vouloir C. – BrianH

0

Votre source de données liée pour remplir la zone de liste déroulante est probablement en lecture seule. Si oui, pourquoi ne pas insérer temporairement la valeur invalide dans la source de données sous-jacente. De cette façon, il serait encore affiché. Vous pouvez ajouter une colonne temporaire pour marquer les éléments non valides et ne pas autoriser l'utilisateur à les laisser sélectionnés, puis les supprimer lorsque l'utilisateur a quitté la cellule. Je n'ai jamais fait cela avec un datagridview mais nous avons fait quelque chose de très similaire avec une grille tierce différente. Bonne chance!