Question

Je veux pouvoir afficher dans une grille de propriétés une liste déroulante affichant une valeur "string" mais renvoyant une valeur "int".

Par exemple, disons que j'ai cette classe :

public class MyObjectOptions : StringConverter
{
    public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
    {
        return true;
    }

    public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
    {
        MyObjectCollection mm = new MyObjectCollection();

        List<String> names = new List<String>
        foreach (MyObject m in mm)
        {
            m.Id // Need to store this somewhere ...
            names.Add(m.Name);
        }

        return new StandardValuesCollection(name);
    }

    public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
    {
        return true;
    }
}

Voici mon utilisation de classe dans le contrôle propertygrid

public class MyObjectProperty
{
    [TypeConverter(typeof(MyObjectOptions))]
    public int Id
    {
        get { return this.id; }
        set { this.id = value; }
    }
}

Comme vous pouvez le voir, je souhaite stocker l'identifiant de l'objet, mais je souhaite afficher son nom dans la liste déroulante...J'essaye d'utiliser une table de hachage mais ça ne marche pas...

BTW - J'utilise la version 3.5 de .Net mais j'utilise uniquement WinForm (pas WPF).

Était-ce utile?

La solution

Vous ne pouvez pas utiliser GetStandardValues ​​pour cela.Cette méthode serait utile si vous deviez limiter vos valeurs entières à, disons, 1, 5 et 10.

Si vous souhaitez afficher des chaînes dans la valeur de votre propriété, il vous suffit de remplacer les méthodes ConvertTo et ConvertFrom de votre TypeConverter.Le PropertyGrid utilisera les chaînes converties dans la liste déroulante.

À propos de votre table de hachage, vous pouvez la stocker dans votre TypeConverter si son contenu est statique.Si c'est dynamique, le mieux est de laisser l'instance cible de la grille le gérer.Depuis votre convertisseur, vous pourrez y accéder via la propriété TypeDescriptorContext.Instance.

J'espère que cela pourra aider.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top