Создайте раскрывающиеся списки, позволяющие выбирать другие элементы управления в текущей форме из конструктора форм Visual Studio. - PullRequest
0 голосов
/ 27 февраля 2012

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

Возьмем следующий пример: форма и кнопка.

Из формы есть свойство 'OKButton', которое вы можете установить. Когда вы открываете диалоговое окно, все возможные кнопки отображаются как возможные варианты в раскрывающемся списке.

У меня есть что-то подобное, где я хочу, чтобы текстовое поле имело свойство с именем "ServiceMember". Когда вы это расширите, это позволит мне выбрать из всех открытых членов моей формы, имеющих тип "ServiceObject".

Возможно ли иметь эту работу в автоматическом смысле? И если нет, я не уверен, как заполнить комбинированный список именами, которых нет в текущем объекте. Они член родительской формы?

1 Ответ

0 голосов
/ 27 февраля 2012

Если вы пытаетесь сделать это как часть конструктора (выводится из тегов, а не чего-либо в тексте вопроса), тогда любое открытое свойство, которое вы имеете в своем пользовательском элементе управления, имеет атрибут AttributeProvider тип IListSource должен быть представлен в конструкторе свойств как выборка. i.e.:

[AttributeProvider(typeof(IListSource))]
public object MyList { get; set; }

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

Однако заполнение этого списка было бы немного болезненным - вы, вероятно, можете использовать Reflection для проверки элемента управления / формы хоста для поиска открытых членов, которые наследуются от ServiceObject - например, см. Проверьте, является ли класс производным от универсального класса или, в равной степени, вы можете привести его к типу и посмотреть, получите ли вы ненулевое возвращаемое значение:

ServiceObject potentialServiceObject = formMember as ServiceObject;
if (potentialServiceObject != null)
{
   // Add to list for dropdown
}
...