2008-12-11 12 views
11

J'ai une classe avec une propriété de chaîne, ayant à la fois un getter et un setter, qui est souvent si long que le PropertyGrid tronque la valeur de la chaîne. Comment puis-je forcer le PropertyGrid à afficher une ellipse, puis lancer une boîte de dialogue contenant une zone de texte multiligne pour faciliter l'édition de la propriété? Je sais que je dois probablement définir une sorte d'attribut sur la propriété, mais quel attribut et comment? Est-ce que mon dialogue doit implémenter une interface de concepteur spéciale?Comment puis-je forcer PropertyGrid à afficher une boîte de dialogue personnalisée pour une propriété spécifique?

Mise à jour: This est probablement la réponse à ma question, mais je ne pouvais pas le trouver en cherchant. Ma question est plus générale, et sa réponse peut être utilisée pour construire n'importe quel type d'éditeur personnalisé.

Répondre

17

Vous devez définir un [Editor(...)] pour la propriété, en lui donnant un UITypeEditor qui effectue la modification; comme si (avec votre propre éditeur ...)

using System; 
using System.ComponentModel; 
using System.Drawing.Design; 
using System.Windows.Forms; 
using System.Windows.Forms.Design; 


static class Program 
{ 
    static void Main() 
    { 
     Application.Run(new Form { Controls = { new PropertyGrid { SelectedObject = new Foo() } } }); 
    } 
} 



class Foo 
{ 
    [Editor(typeof(StringEditor), typeof(UITypeEditor))] 
    public string Bar { get; set; } 
} 

class StringEditor : UITypeEditor 
{ 
    public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context) 
    { 
     return UITypeEditorEditStyle.Modal; 
    } 
    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) 
    { 
     IWindowsFormsEditorService svc = (IWindowsFormsEditorService) 
      provider.GetService(typeof(IWindowsFormsEditorService)); 
     if (svc != null) 
     { 
      svc.ShowDialog(new Form()); 
      // update etc 
     } 
     return value; 
    } 
} 

Vous pourriez être ABLT pour traquer un éditeur existant en regardant les propriétés existantes qui se comportent comme vous voulez.

+1

Merci pour la réponse rapide. Je vous donne un +1 pour le moment et je vais marquer cela comme la bonne réponse une fois que j'ai une chance de l'essayer de mon côté. – flipdoubt

+0

Est-il possible de rendre la zone de texte 'Bar' dans propertygrid en lecture seule afin que l'utilisateur ne puisse pas coller le texte directement dans la zone de texte de la propriété, mais uniquement via une boîte de dialogue modale? Setter n'est pas appelé si j'ajoute l'attribut ReadOnly (true). – lerner1225

+0

@ lerner1225 Vous avez besoin d'un convertisseur de type do-nothing - voir http://stackoverflow.com/a/30194849/127670 –

Questions connexes