3

How can I dynamically initialize a win form. In my application I am having numerous forms, like more than 50 and the below code is repeated as many times..

so I want to create some function for it and do this job. But how can I create a new () instance of a particular Form.
Any help will be greatly appreciated.

private void ShowForm(object frm)
{
    if (frm == null || frm.IsDisposed)
    {
        frm = new <<Here is some Class Name>> { MdiParent = this };
        frm.Show();
        frm.WindowState = FormWindowState.Maximized;
    }
    else
    {
        frm.Activate();
    }
 }
4

4 回答 4

7

If you know the Type to use, you can use Activator.CreateInstance:

private void ShowForm(Form form, Type type)
{
    if (form == null || form.IsDisposed)
    {
        form = (Form) Activator.CreateInstance(type);
        form.MdiParent = this;
        form.Show();
        form.WindowState = FormWindowState.Maximized;
    }
    else
    {
        form.Activate();
    }
}

Or if you're calling it from different places and know at compile-time which type to use:

private void ShowForm<T>(T form) where T : Form, new()
{
    if (form == null || form.IsDisposed)
    {
        form = new T();
        form.MdiParent = this;
        form.Show();
        form.WindowState = FormWindowState.Maximized;
    }
    else
    {
        form.Activate();
    }
}
于 2013-09-24T16:01:44.340 回答
1

You can use reflection.

Activator.CreateInstance - MSDN

        frm = (Form)Activator.CreateInstance(t) // t is a type parameter
于 2013-09-24T16:02:04.637 回答
0

Use Activator:

var form = System.Activator.CreateInstance(Type.GetType(yourclassname)), null) as Form;
form.ShowDialog();
于 2013-09-24T16:02:35.273 回答
0

Use the power of generics:

    private void ShowForm<T>(T frm) where T : Form
    {
        if (frm == null || frm.IsDisposed)
        {
            frm = new T { MdiParent = this };
            frm.Show();
            frm.WindowState = FormWindowState.Maximized;
        }
        else
        {
            frm.Activate();
        }
    }
于 2013-09-24T16:03:24.473 回答