Является ли Enum единственным способом показать значения для свойства в виде раскрывающегося списка во время разработки

Я знаю, что когда я использую Enum и помещаю его как Property для класса/UserControl, он будет показывать/отображать его с раскрывающимся списком следующим образом:

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

Но это единственный способ отобразить доступные значения, такие как «раскрывающийся список»? Есть ли у нас другие способы сделать это?

Изменить: областью действия является приложение Windows Form.

Для тех, кто меня не понял

На этом изображении (https://i.stack.imgur.com/NMank.png) где написано "база данных" - это Name из Property во время разработки.

Значения: NotChoseYET, ChooseDataBase, ThereAlreadyDataBase являются значениями в Enum, который я создал.

Как видите, они отображаются в виде DropDownList в дизайне, поэтому я хочу спросить, есть ли другие способы отображения без Enum?


person onemore More    schedule 26.08.2014    source источник
comment
Вы можете использовать преобразователь, который примет значение перечисления и вернет отображаемую строку.   -  person d.moncada    schedule 27.08.2014
comment
Какие??? Я неправильно вас понимаю, мой вопрос не в том, чтобы преобразовать какой-либо Enum во что-либо. Мне просто интересно, есть ли какой-либо элемент управления или какой-либо другой способ показать значения, как на картинке, кроме использования Enum   -  person onemore More    schedule 27.08.2014
comment
Что это за проект? WinForms, WPF и т. д.?   -  person Joshua Shearer    schedule 27.08.2014
comment
Приложение формы Windows   -  person onemore More    schedule 27.08.2014
comment
Я не очень понимаю ваш вопрос. Это единственный способ автоматически сделать это? Наверное. Вы можете использовать любой элемент управления, который вы хотите (на ум приходят радиокнопки), вам просто нужно настроить некоторые из них самостоятельно. Или это из-за того, что он находится в DataGrid (не ясно, если это из вашего изображения)?   -  person BradleyDotNET    schedule 27.08.2014
comment
@BradleyDotNET, я спрашиваю, есть ли другой способ получить такие значения, как DropDownList, в дизайнере/свойстве, или только Enum может это сделать, если я использую Enum и создаю значения в этом перечислении, когда я создаю свойство для этого Enum, оно отображается в DropDownList. поэтому я спрашиваю, есть ли другой способ отображения значений в DropDownList в дизайнере без Enum   -  person onemore More    schedule 27.08.2014
comment
Вы спрашиваете, есть ли другой элемент управления, который отображает такие значения, как DropDownList, но не является DropDownList?   -  person Michael McGriff    schedule 27.08.2014


Ответы (3)


Обновить

После множества поисков я обнаружил, что то, что я ответил, было лишь частично правильным, поэтому я хотел бы ответить на него снова.

Ответ на ваш вопрос однозначно НЕТ, у нас есть другой способ показать значения свойства как DropDownList. Как я упоминал в своем старом ответе, если значения поступают из какого-то Set или, другими словами, они принадлежат набору значений, они будут отображаться как DropDownList без каких-либо дополнительных усилия (поскольку для них было указано UITypeEditor, вы поймете этот момент позже). Вот 3 примера:

  • Если Property является bool, в дизайнере он покажет вам, что DropDownList содержит True и False;

раскрывающийся список с двумя значениями

  • Если Property является Font.Name, в дизайнере он покажет вам DropDownList с SmallIcon;

раскрывающийся список с маленьким значком

  • если Property является Color, в дизайнере он покажет вам некоторые DropDownList, инкапсулированные в TabControl.

элемент управления вкладкой инкапсулирует раскрывающийся список

Из этих «нативных» примеров вы можете понять один факт: мы могли каким-то образом использовать некоторые элементы управления, кроме простого DropDownList в Property Tab во время разработки. Например, свойство Color дает TabControl вместо простого DropDownList, а свойство Font.Name дает настроенное DropDownList.

Да, это вторая вещь, о которой я собираюсь поговорить. Вы можете настраивать не только элементы в DropDownList, но и View этого Value Choosing Editor.

Однако это очень сложно и нетривиально. Вам не рекомендуется делать это, если это действительно не добавляет ценности вашему пользовательскому элементу управления во время разработки.

Короче говоря, вам нужно наследоваться от UITypeEditor и переопределить 2 функции:

GetEditStyle(), который

указывает среде разработки, какой тип пользовательского интерфейса реализует ваш редактор типов пользовательского интерфейса.

и EditValue(), который

устанавливает взаимодействие между средой проектирования и пользовательским интерфейсом для редактирования пользовательского типа

Затем для вашего свойства, которое использует Editor, вам нужно добавить к нему EditorAttribute, чтобы указать Editor, используемое при выборе значения этого свойства.

Для получения более подробных сведений рекомендуется ознакомиться с этим пошаговым руководством MSDN. , в котором объясняется, как создать индивидуальный Value Editor во время разработки.

Теперь вернемся к тому месту, где мы остановились. Родной тип, такой как bool и Color, уже связан с UITypeEditor, поэтому дальнейшая работа не требуется.


Старый ответ:

Для свойств вам нужно выбрать значение из типа Set, и все элементы в этом Set будут отображаться как Items в DropDownList во время разработки. Когда вы пытаетесь определить Set, Enum является одним из методов их определения. Также вы можете использовать set of struct, например Color. Другими словами, если у вас есть Property, который возвращает Color (или другие структуры), во время разработки он будет отображаться в виде раскрывающегося списка.

person nevets    schedule 27.08.2014
comment
можете ли вы дать мне пример, что вы имеете в виду struct Set - person onemore More; 27.08.2014

Вы можете легко добавлять элементы в поле со списком, используя его свойство .Items:

  private void TestForm_Load(object sender, EventArgs e)
  {
     for (int i = 0; i < 10; i++)
     {
        // add items to the combobox
        // you can use any object. The .ToString() method will be used for displaying it
        cbxTest.Items.Add("This is test string " + i);
     }
  }

Это даст следующую форму:

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

person WeSt    schedule 26.08.2014
comment
я не имел в виду во время выполнения, я имею в виду в режиме дизайнера, когда вы выбираете свойство для управления, например: шрифт, цвет фона. если есть способ отобразить такие свойства (как вы показываете), но в конструкторе показать их как свойства - person onemore More; 27.08.2014
comment
Тогда вы все равно можете использовать свойство .Items. Даже в конструкторе. - person WeSt; 27.08.2014
comment
Я знаю это, но я не это имел в виду. посмотрите на это изображение: i.stack.imgur.com/NMank.png свойство управления, которое я сделал. которые открывают его в режиме разработки, таком как поле со списком, это свойство Enum - person onemore More; 27.08.2014
comment
на том изображении(i.stack.imgur.com/NMank.png), где написано DataBase — это имя свойства, а значения: NotChoseYET, ChooseDataBase, ThereAlreadyDataBase — это значения в Enum, которые я создал. вы видите, что в дизайне он отображается как DropDownList, поэтому я спрашиваю, есть ли другой способ отображения без Enum - person onemore More; 27.08.2014
comment
@WeSt он хочет, чтобы это было сделано во время разработки, но не во время выполнения - person nevets; 27.08.2014

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

В двух словах: реализуйте преобразователь типов GetStandardValuesSupported(ITypeDescriptorContext context) для возврата true и GetStandardValues(ITypeDescriptorContext context) для возврата StandardValuesCollection для типа свойства. Наконец, просто украсьте свойство следующим образом:

[TypeConverter(typeof(MyClassConverter))]
public MyClass MyProperty { get; set; } 

Окно свойств дизайнера теперь будет иметь раскрывающийся список с допустимыми значениями.

person okipol    schedule 20.08.2017