2010-02-01 6 views
1

Я пытаюсь использовать сетку свойств в дизайнере для Visual Studio.C# Свойство для списка классов

У меня есть список классов, которые я хочу, чтобы разработчик мог добавлять во время разработки, чтобы пользователь мог получить доступ к дополнительным функциям.

Вот пример кода, который у меня есть в коде. Проблема заключается в том, что разработчик переходит в режим разработки, он может видеть только, что в списке есть x количество значений, но не может увидеть какие-либо детали. При попытке добавить новый элемент в список пользователь получает сообщение об ошибке.

Конструктор по типу 'EditorTextBox + SyntaxRegex' не найден.

Теперь код:

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;} 
} 

ответ

3

Вам нужно добавить преобразователи/редакторы типа; хорошее начало было бы добавить:

[TypeConverter(typeof(ExpandableObjectConverter))] 

над каждым class определения. Например, следующие работает отлично (заметьте, я изменил свойство, убран список сеттер, и т.д.):

[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() 
       } 
      } 
     }); 
    } 
} 

Конкретное сообщение об ошибке также заставляет меня задаться вопросом, если ваш фактического типа общедоступен конструктора общественным без параметров (тот факт, что он не компилируется, заставляет меня подозревать, что вы не разместили фактический код ...)

+0

Я укоротил код для пробела. Добавлен конвертер типов. –

+0

@Joshua - сокращение места простое, но сокращенная версия в идеале должна компилироваться (*) и демонстрировать проблему. * = если вы не спрашиваете о проблеме синтаксиса, которая предотвращает компиляцию. –

Смежные вопросы