2013-03-26 2 views
4

я есть TreeView, которые каждый узел тег содержит имя формы, когда я нажимаю на узле я открыть форму мой код выглядит следующим образомоткрыть новые WinForm

private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) 
     { 
      NodeClick(Convert.ToString(e.Node.Tag)); 
     } 

    public void NodeClick(string formName) 
    { 
     switch (formName) 
     { 

      case "frmPartMaster": 
       frmPartMaster partMaster = null; 
       if ((partMaster = 
        (frmPartMaster)Globale.IsFormAlreadyOpen(typeof(frmPartMaster))) 
         == null) 
       { 
        partMaster = new frmPartMaster(); 
        partMaster.Show(this); 

       } 
       else 
       { 
        partMaster.Activate(); 
        partMaster.WindowState = FormWindowState.Normal; 
        partMaster.BringToFront(); 
       } 
       break; 
     } 
    } 

этот код работает нормально, но у меня есть 1000-формы , для каждого для формы я должен правильно ввести код. Возможно ли, если я прошел форму, которую он открыл, как в одном случае?

ответ

0

Вы должны иметь возможность добавить форму к узлу, узел должен иметь поле, тэг, я думаю, что это объект типа. Добавьте свою форму, затем извлеките ее из тега. Таким образом вам не придется использовать оператор case, но один оператор, который работает для всех форм.

0

Вместо того, чтобы использовать ключ для каждой формы, вы можете использовать метод Activator.CreateInstance.

См. Это MSDN Article.

Вы можете сохранить Полностью квалифицированное имя в тег и используйте его для создания соответствующей формы.

2

Вы можете создать экземпляр класса формы по зову Activator.CreateInstance

public void OpenOrActivateForm(string formType) 
{ 
    var formType = Type.GetType(formType); 
    var form = Globale.IsFormAlreadyOpen(formType); 

    if(form == null) 
    { 
    form = Activator.CreateInstance(formType); 
    from.Show(this); 
    } 
    else 
    { 
    form.Activate(); 
    form.WindowState = FormWindowState.Normal; 
    form.BringToFront(); 
    } 
} 
+0

Я думаю, что лучше всего использовать функцию Activator.CreateInstance, когда мы в много форм и мы хотим получить общее решение для создания экземпляров этих форм. –

0

Вы могли бы использовать этот подход:

Определение Словарь строк и действий, как это

Dictionary<string, Action> dic = new Dictionary<string,Action>(); 
dic.Add("frmPartMaster", OpenPartMaster); 
..... 

добавить соответствующие меры

private void OpenPartMaster() 
{ 
    frmPartMaster partMaster = null; 
    if ((partMaster = 
       (frmPartMaster)Globale.IsFormAlreadyOpen(typeof(frmPartMaster))) 
        == null) 
    { 
       partMaster = new frmPartMaster(); 
       partMaster.Show(this); 

    } 
    else 
    { 
       partMaster.Activate(); 
       partMaster.WindowState = FormWindowState.Normal; 
       partMaster.BringToFront(); 
    } 
} 

и когда вам нужно вызвать эту форму вместо бесконечного переключателя использовать

dic[formName].Invoke(); 

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

Этот подход интересен, если у вас есть разные действия (случаи) для вашей формы, а не всегда одна и та же последовательность повторяющихся кодов.

2

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

private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) 
     { 
      NodeClick(e.Node.Tag as Form); 
     } 

public void NodeClick(Form theForm) 
{ 
    if(theForm == null) return; 

    if(theForm.Visible == false) 
    { 
     theForm .Show(this); 
    } 

    theForm .Activate(); 
    theForm .WindowState = FormWindowState.Normal; 
    theForm .BringToFront(); 
} 
Смежные вопросы