как вызвать mdi форму функцией - PullRequest
0 голосов
/ 26 марта 2012

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

Students stu = null;
    private void studentsToolStripMenuItem1_Click(object sender, EventArgs e)
    {
        if (stu == null || stu.IsDisposed)
        {
            stu = new Students();
            stu.MdiParent = this;
            stu.Show();
        }
        else
        {
            stu.Activate();
        }
    }

, хотя я хочу, чтобы это было так

private void studentsToolStripMenuItem1_Click(object sender, EventArgs e)
    {
        CreateMdiChild(Students);
    }

и функция должна быть такой

public void CreateMdiChild(Form form)
    {
        //expected code            
    }

Ответы [ 2 ]

2 голосов
/ 26 марта 2012

Вы можете сделать метод общим, например:

public void CreateMdiChildOrActivate<T>(ref T instance) where T : Form, new()
{
    if (instance == null || instance.IsDisposed)
    {
        instance = new T();
        instance.MdiParent = this;
        instance.Show();
    }
    else
    {
        instance.Activate();
    }
}

Использование:

private void studentsToolStripMenuItem1_Click(object sender, EventArgs e)
{
    CreateMdiChildOrActivate(ref this.stu);
}

РЕДАКТИРОВАТЬ:

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

Создать поле словаря классов, содержащее открытую форму для каждого типа формы:

private Dictionary<Type,Form> openForms = new Dictionary<Type,Form>();

Затем изменитьпредыдущий метод:

public void CreateMdiChildOrActivate<T>() where T : Form, new()
{
    Form instance;
    openForms.TryGetValue(typeof(T), out instance);
    if (instance == null || instance.IsDisposed)
    {
        instance = new T();
        openForms[typeof(T)] = instance;
        instance.MdiParent = this;
        instance.Show();
    }
    else
    {
        instance.Activate();
    }
}

Теперь вы можете назвать его так:

private void studentsToolStripMenuItem1_Click(object sender, EventArgs e)
{
    CreateMdiChildOrActivate<Student>();
}
0 голосов
/ 20 февраля 2013
public void CreateMdiChild<T>(Form f) where T : Form, new()
{
    foreach (Form frm in f.MdiChildren)
    {
        if (frm.GetType() == typeof(T))
        {                        
            if (frm.WindowState == FormWindowState.Minimized)
            {
                frm.WindowState = FormWindowState.Normal;
            }
            else
            {
                frm.Activate();
            }
            return;
        }                    
    }
    T t = new T();
    t.MdiParent = f;
    t.Show();
}

Использование

CreateMdiChild<MyForm>()
...