3 Вопрос: Как я могу использовать PropertyGrid WinForms для редактирования списка строк?

вопрос создан в Wed, Apr 24, 2013 12:00 AM

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

Проблема в том, что если в моем коде есть MyPropertyGrid.SelectedObject = new { Test = new List<string>() };, а пользователь пытается изменить свойство Test, то при нажатии на кнопку «Добавить» возникает следующая ошибка:

 Constructor on type 'System.String' not found

Это имеет смысл, поскольку строки неизменны. Однако мне все еще нужен какой-то способ для хранения нескольких строк (или строковых данных) в сетке свойств.

У кого-нибудь есть идеи, как мне это сделать?

    
19
  1. Попробуйте это, MyPropertyGrid.SelectedObjec = Test //он вернет список строк при нажатии кнопки, задайте список строк в свойстве Test ....
    2011-06-10 14: 22: 16Z
  2. Я не уверен, что вы хотите попробовать, так как похоже, что ваш код съеден форматом комментариев.
    2011-06-10 14: 27: 59Z
3 ответа                              3                         

Да, вы можете указать атрибут System.ComponentModel.Editor в своем список строк, с редактором StringCollectionEditor . Вам нужно добавить ссылку на System.Design.Dll в ваш проект, чтобы это можно было скомпилировать.

Пример, предположим, что ваш объект похож на это:

[DefaultProperty("Name")]
public class CustomObject
{
    [Description("Name of the thing")]
    public String Name { get; set; }

    [Description("Whether activated or not")]
    public bool Activated { get; set; }

    [Description("Rank of the thing")]
    public int Rank { get; set; }

    [Description("whether to persist the settings...")]
    public bool Ephemeral { get; set; }

    [Description("extra free-form attributes on this thing.")]
    [Editor(@"System.Windows.Forms.Design.StringCollectionEditor," +
        "System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a",
       typeof(System.Drawing.Design.UITypeEditor))]
    [TypeConverter(typeof(CsvConverter))]
    public List<String> ExtraStuff
    {
        get
        {
            if (_attributes == null)
                _attributes = new List<String>();
            return _attributes;
        }
    }
    private List<String> _attributes;
}

Сетка свойств для этого выглядит следующим образом:

введите описание изображения здесь

Нажмите на ... и вы получите:

введите описание изображения здесь

Если вам не нравится встроенный редактор коллекций, вы можете реализовать свой собственный редактор коллекций .

В моем примере показано использование атрибута TypeConverter. Если вы не делаете этого , то список отображается в сетке проповедников как «(Коллекция)». TypeConverter отображает его как нечто интеллектуальное . Например, для отображения короткого строкового представления коллекции в сетке свойств, например:

введите описание изображения здесь

... TypeConverter выглядит следующим образом:

public class CsvConverter : TypeConverter
{
    // Overrides the ConvertTo method of TypeConverter.
    public override object ConvertTo(ITypeDescriptorContext context,
       CultureInfo culture, object value, Type destinationType)
    {
        List<String> v = value as List<String>;
        if (destinationType == typeof(string))
        {
            return String.Join(",", v.ToArray()); 
        }
        return base.ConvertTo(context, culture, value, destinationType);
    }
}

Вам не нужен установщик для List<String>, потому что редактор коллекции не устанавливает это свойство, он просто добавляет или удаляет записи в свойстве. Так что просто предоставьте получатель.

    
43
2011-06-10 15: 55: 46Z
  1. Удивительно, первый метод работает как шарм (редактор коллекций строк должен работать нормально для моих нужд). Очень ценится:)
    2011-06-10 16: 08: 01Z
  2. Отличный ответ:)
    2013-09-26 14: 03: 39Z
  3. Отличный ответ!
    2017-04-14 09: 41: 15Z

Если вам просто нужен строковый контейнер, просто используйте: BindingList<string> вместо list<string>

Редактор создается автоматически.

Также "Касти"нг "назад и вперед до List<T> легко. От List до BindingList просто используйте конструктор bList = BindingList(orignalList) (если вы получаете ошибку только для чтения - вставьте список по одному). и чтобы получить список, вы можете использовать метод расширения .ToList().

    
7
2013-12-01 18: 01: 59Z
  1. Очень хороший и простой ответ.
    2014-01-04 11: 38: 08Z

В объявлении свойства отсутствует один важный атрибут: [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] р>

Без этого конструктор не сериализует данные коллекции.

    
3
2013-04-24 10: 26: 41Z
  1. Работает без атрибута, если вы используете список привязок, т. е. BindingList < string >
    2013-07-25 22: 36: 26Z
источник размещен Вот