2010-02-01 3 views
1

J'essaie d'utiliser la grille de propriétés dans le concepteur pour Visual Studio.C# Propriété pour une liste de classes

J'ai une liste de classes que je veux que le développeur puisse ajouter au moment du design afin que l'utilisateur puisse avoir accès à des fonctionnalités supplémentaires.

Voici un exemple de code de ce que j'ai déjà dans le code. Le problème est que lorsque le développeur passe en mode conception, il ne peut voir que x nombre de valeurs dans la liste, mais il est incapable de voir les détails. Lorsque vous essayez d'ajouter un nouvel élément à la liste, l'utilisateur reçoit une erreur.

Le constructeur sur le type 'EditorTextBox + SyntaxRegex' est introuvable.

Maintenant le code:

private List<SyntaxRegex> _syntaxRegexList = new List<SyntaxRegex>(); 
public class SyntaxRegex 
{ 
    public string title; 
    public string regex; 
    public Color color; 
} 
Public List<SyntaxRegex> SyntaxRegexList 
{ 
    get{_syntaxRegexList = value;} 
    set{return _regexList;} 
} 

Répondre

3

Vous devez ajouter des convertisseurs/éditeurs de type; un bon point de départ serait d'ajouter:

[TypeConverter(typeof(ExpandableObjectConverter))] 

ci-dessus chaque définition class. Par exemple, ce qui suit fonctionne très bien (note que j'ai changé les propriétés, enlevé le poseur de liste, etc.):

[TypeConverter(typeof(ExpandableObjectConverter))] 
class Foo { 
    private List<SyntaxRegex> _syntaxRegexList = new List<SyntaxRegex>(); 
    [TypeConverter(typeof(ExpandableObjectConverter))] 
    public class SyntaxRegex 
    { 
     public override string ToString() { 
      return string.IsNullOrEmpty(Title) ? "(no title)" : Title; 
     } 
     public string Title { get; set; } 
     public string Regex { get; set; } 
     public Color Color { get; set; } 
    } 
    [DisplayName("Patterns")] 
    public List<SyntaxRegex> SyntaxRegexList 
    { 
     get { return _syntaxRegexList; } 
    } 
    [STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.Run(new Form 
     { 
      Controls = 
      { 
       new PropertyGrid { 
        Dock = DockStyle.Fill, 
        SelectedObject = new Foo() 
       } 
      } 
     }); 
    } 
} 

Le message d'erreur spécifique me fait aussi me demande si votre réelle de type est public avec un constructeur de parameterless publique (le fait qu'il ne compile pas me fait suspecter que vous n'avez pas posté le code réel ...)

+0

J'ai raccourci le code pour l'espace. Ajout du convertisseur de type travaillé. –

+0

@Joshua - raccourcir pour l'espace est bien, mais la version raccourcie devrait idéalement encore compiler (*) et démontrer le problème. * = sauf si vous posez des questions sur un problème de syntaxe qui empêche compilaton. –

Questions connexes