Как программно сненерировать окно?

vlsaf
Дата: 02.02.2010 19:13:04
Всем привет.

В MDI проекте есть много различных дочерних окон. Для простоты назову их так:
Form1 fоrm1;
Form2 form2;
Form3 form3;

При старте программы главное окно приложения вытаскивает данные о том, какие окна следует сразу же открыть. Названия форм, которые нужно открыть автоматически, содержатся в текстовом массиве.

Конечно же формы можно инициализоровать и открывать через
Switch(formName)
{
    case "Form1": form1 = new Form1(); 
}

Но у меня вопрос. Можно ли формы инициализировать универсально, не выписывая для каждой вновь создаваемой формы свое case ?

Как-то так:
object = new object(formName);
чтобы имя формы было в качестве параметра, а на выходе мы бы имели нашу форму?
Может как-то через рефлексию?
liver
Дата: 02.02.2010 19:28:48
public void CreateForm(string ClassFormName)
{
    // Получаем тип по имени.
    Type t = Type.GetType(path + ClassFormName);
    // Создаем переменную по типу.
    ILoadInterface v = (ILoadInterface)Activator.CreateInstance(t);
    // Вызываем метод.
    v.ShowForm();
}
vlsaf
Дата: 02.02.2010 21:55:11
Огромнейшее спасибо!!!
vlsaf
Дата: 03.02.2010 11:19:58
Не разберусь с path для строки "Form_User"

Как он вычисляется?

Имеется следующая цепочка:
public partial class Form_User : ClientsManagement.XtraForm_Template
public partial class XtraForm_Template : DevExpress.XtraEditors.XtraForm


Или может можно под отладчиком как-то посмотреть правильный путь (тип)?
vlsaf
Дата: 03.02.2010 11:44:40
С путем разобрался. Это имя неймспейса.
vlsaf
Дата: 03.02.2010 11:50:36
Дико извиняюсь, теперь непонятки с ILoadInterface

Можете дать описание этого интерфейса?
vlsaf
Дата: 03.02.2010 12:18:16
Для вызова формы сделал так:
object obj = t.GetConstructor(new Type[] { }).Invoke(null);
MethodInfo mi = t.GetMethod("Show", new Type[] { });
mi.Invoke(obj, null);

осталось для полного счастья объекту присвоить значение. Типа такого..
form_User.MdiParent = this;

Ща бум думать....

Придумал. Получилось так:
            // Получаем тип по имени.
            Type t = Type.GetType("ClientsManagement." + ClassFormName);

            // Создаем переменную по типу.
            object obj = t.GetConstructor(new Type[] { }).Invoke(null);

            // переменной присваиваем свойство MdiParent
            TypeDescriptor.GetProperties(t)["MdiParent"].SetValue(obj, form_Main);

            // вызываю метод Show
            MethodInfo mi = t.GetMethod("Show", new Type[] { });
            mi.Invoke(obj, null);
ZhV
Дата: 03.02.2010 12:58:27
Я бы добавил проверки - что данный класс существует и что этот класс есть форма - всяко бывает в большом хозяйстве классов и сборок.
Где-то так
if( (t != null) && (typeof(Form)).IsAssignableFrom(t))  )
{
....
}

Хотя можно и try/exception.
skyANA
Дата: 03.02.2010 13:38:49
vlsaf

Придумал. Получилось так:
            // Получаем тип по имени.
            Type t = Type.GetType("ClientsManagement." + ClassFormName);

            // Создаем переменную по типу.
            object obj = t.GetConstructor(new Type[] { }).Invoke(null);

            // переменной присваиваем свойство MdiParent
            TypeDescriptor.GetProperties(t)["MdiParent"].SetValue(obj, form_Main);

            // вызываю метод Show
            MethodInfo mi = t.GetMethod("Show", new Type[] { });
            mi.Invoke(obj, null);
Жесть :). Вам же уже написали куда смотреть:
    // Создаем переменную по типу.
    Form form = (Form)Activator.CreateInstance(t);
    // Устанавливаем значение свойства.
    form.MdiParent = form_Main;
    // Вызываем метод.
    form.Show();
vlsaf
Дата: 03.02.2010 16:23:40
Конечно жесть.

Вот эта строчка
Form form = (Form)Activator.CreateInstance(t);
не катит, т.к. создается форма типа Form, а мне нужно, чтобы создавалась форма моего типа и тип этот будет разный для разных форм. Мне нужно было как раз уйти от жестко задаваемого типа формы.