Свойство времени проектирования Visual Studio - выпадающий список формы

[РЕДАКТИРОВАНИЕ], Чтобы быть ясным, я знаю, как получить список форм через отражение. Я более обеспокоен сеткой свойства времени проектирования.

У меня есть пользовательский элемент управления с общественной собственностью Формы типа.
Я хочу смочь выбрать форму во время проектирования от выпадающего.
Я хочу заполнить выпадающий список формы от пространства имен набора: UI.Foo. Формы

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

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

Спасибо за Вашу справку заранее.

5
задан Dustin Brooks 6 May 2010 в 01:32
поделиться

1 ответ

Вы можете легко получить классы через Reflection:

var formNames = this.GetType().Assembly.GetTypes().Where(x => x.Namespace == "UI.Foo.Forms").Select(x => x.Name);

Предполагая, что вы вызываете это из кода в той же сборке, что и ваши формы, вы получите имена всех типов, которые находятся в пространстве имен «UI.Foo.Forms». Затем вы можете представить это в раскрывающемся списке и, в конечном итоге, создать экземпляр того, что выбрано пользователем через отражение еще раз:

Activator.CreateInstance(this.GetType("UI.Form.Forms.FormClassName"));

[Edit] Добавление кода для материала времени разработки:

В вашем элементе управления вы можете создать свойство Form как таковое:

[Browsable(true)]
[Editor(typeof(TestDesignProperty), typeof(UITypeEditor))]
[DefaultValue(null)]
public Type FormType { get; set; }

которое ссылается на тип редактора, который должен быть определен. Код довольно понятен, с минимальным количеством настроек вы, вероятно, сможете получить именно то, что хотите.

public class TestDesignProperty : UITypeEditor
{
    public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
    {
        return UITypeEditorEditStyle.DropDown;
    }

    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
    {
        var edSvc = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));

        ListBox lb = new ListBox();
        foreach(var type in this.GetType().Assembly.GetTypes())
        {
            lb.Items.Add(type);
        }

        if (value != null)
        {
            lb.SelectedItem = value;
        }

        edSvc.DropDownControl(lb);

        value = (Type)lb.SelectedItem;

        return value;
    }
}
7
ответ дан 14 December 2019 в 01:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: