2 votes

Référence de mise à jour de l'objet métier combobox de Datagridview

J'ai récemment posé cette question ici et a obtenu la réponse. Cependant, j'essaie maintenant d'appliquer la même logique à un DataGridView qui est lié à une BindingList< T > d'objets Curriculum. La classe Curriculum possède une propriété de type Year. J'essaie d'utiliser une colonne ComboBox pour mettre à jour la référence aux années de l'objet Curriculum.

La colonne combobox est liée à une BindingList< T > d'années, des erreurs se produisent si je définis le membre display ou le membre value, c'est pourquoi je les ai laissés nuls. En procédant ainsi, la datagridview se charge et affiche les données correctement (j'ai remplacé la méthode ToString de la classe year). Cependant, si je choisis un autre objet année dans le combobox, dès qu'il termine les éditions, il lève une exception disant qu'il ne peut pas convertir la chaîne de caractères en type année.

Il semble que j'ai besoin d'un convertisseur de type pour le faire, mais le problème est que le combobox affiche une valeur descriptive, dont je ne peux pas garantir qu'elle sera unique pour cet objet année - je n'ai donc aucun moyen d'obtenir un objet année à partir d'une chaîne de caractères donnée.

Je ne sais pas si quelqu'un a de l'expérience dans ce genre de situation, cela doit être une chose assez courante, mais Google ne m'a pas permis d'y arriver.

Marlon

3voto

Laviak Points 221

Même problème que aquí . Il semble que la liaison d'objets dans une colonne combobox ne fonctionne pas correctement et qu'il faille spécifier un ValueMember.

Pour le projet particulier sur lequel je travaille, je suis arrivé à la conclusion qu'il ne valait pas la peine d'implémenter un descripteur de type personnalisé, donc à la place, j'utilise un hack assez horrible :

Dans l'entité à laquelle je suis lié, j'ai les éléments suivants :

class TestEntity
{
    public TestEntity BindingHack_ValueMember
    {
        get
        {
           return this;
        }
    }
    public string BindingHack_DisplayMember
    {
        get
        {
            return this.ToString();
        }
    }
}

Et la liaison de données pour la colonne ressemble à ceci :

column.DataPropertyName = "Foo";
column.DisplayMember = "BindingHack_DisplayMember";
column.ValueMember = "BindingHack_ValueMember";

Un peu moche, peut-être, mais ça marche...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X