2013-03-20 2 views
0

У меня есть контроль PropertyGrid, к которому я связать контейнер с массивом сложных объектов:PropertyGrid контроль + массив пользовательских объектов

// Collection 
public class ParametersCollection 
{ 
    private ParameterObject [] _parameters = null; 

    [Category("SubReportParams")] 
    public ParameterObject [] Parameters 
    { 
     get { return _parameters; } 
     set { _parameters = value; } 
    } 

    public ParametersCollection() 
    { 
     // _parameters initialization here... 
    } 
} 

// Complex object 
public class ParameterObject 
{ 
    private string _name = ""; 
    private string _value = ""; 

    [Category("Information"), DisplayName("Name")] 
    public string Name 
    { 
     get { return _name; } 
     set { _name = value; } 
    } 

    [Category("Information"), DisplayName("Value")] 
    public string Value 
    { 
     get { return _value; } 
     set { _value = value; } 
    } 
} 

Все работает отлично, за исключением двух случаев:

  1. В примере, если array _parameters имеет только 2 элемента, размер массива по умолчанию равен 4, а элементы с индексами 2 и 3 - это нули. PropertyGrid отображает эти элементы как пустые поля. Как заставить PropertyGrid игнорировать эти поля и просто не отображать его?

  2. переменная _parameters - это тип массива, поэтому элементы _parameters отображаются со своими индексами от 0 до n. Есть ли возможность отображать их с их именами из свойства ParamObject.Name вместо их индексов из массива?

ответ

1

Для первого вопроса самым простым способом является добавление «поддельного» свойства, вычисленного из «реального» свойства. Это не идеально, но вы можете использовать различные атрибуты, чтобы помочь:

  • отображаемое_имя дать поддельную свойству имя недвижимости
  • Browsable (ложь) указывает таблицу свойств, чтобы пропустить недвижимое имущество
  • РедакторBrowsable (никогда) инструктирует Intellisense Visual Studio не показывать это свойство во внешнем коде.

    [Browsable(false)] 
        public ParameterObject[] Parameters 
        { 
         get { return _parameters; } 
         set { _parameters = value; } 
        } 
    
        [Category("SubReportParams"), DisplayName("Parameters")] 
        [EditorBrowsable(EditorBrowsableState.Never)] 
        public ParameterObject[] NonEmptyParameters 
        { 
         get 
         { 
          return _parameters.Where(p => p != null).ToArray(); 
         } 
        } 
    

Что касается второго вопроса, один простой способ добавить реализацию ToString(), как это:

public class ParameterObject 
{ 
    public override string ToString() 
    { 
     return Name; 
    } 
} 

В противном случае, вы можете добавить пользовательские TypeConverter к классу.

+0

Спасибо за ваш повтор. В первом случае «return_parameters.Where (p => p! = Null) .ToArray();" был правильный намек :-) И решение второй проблемы состояло в том, чтобы использовать ICustomTypeDescriptor. –

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