2017-07-26 25 views
-1

我下面的WinForms類似的參數很多不同的WinForms。如何調用具有C#

frmBase frmChild1frmChild2 ......,frmChild20

共有21個表格。從frmBase,我會根據條件調用Button上的所有其他表單。所有參數都有3組參數。例如:

frmChild1 objForm = new frmChild1(); 
objForm.strName = txtName.Text1; 
objForm.strAddr = txtAddress.Text2; 
objForm.strCity = txtCity.Text2; 
objForm.ShowDialog(); 

如果我打電話給所有這樣的表格,我的編碼量很大。由於只有表單名稱正在更改,是否有另一種簡單的方法可以從基本表單按鈕單擊來調用所有20個表單。

+3

列出所需的表單類型並通過循環實例化它們。但是使用ShowDialog,無論如何您都只能一次顯示一個。 – Lennart

+1

無論如何,您無法在多個表單中使用ShowDialog ......一次實例化所有表單有什麼意義? –

+0

@ZoharPeled,並不是所有的形式一次。我在按鈕上方有一個下拉菜單。在該下拉列表中,我將在填充文本框後選擇一個表單,當我單擊該按鈕時,相應的表單應該打開。 – Sakthi

回答

0

你可以試試下面的代碼。

解決方案1:

using Microsoft.VisualBasic; 
using System; 
using System.Collections; 
using System.Collections.Generic; 
using System.Data; 
using System.Diagnostics; 
public class ObjectFinder 
{ 
    private static object CreateObjectInstance(string objectName) 
    { 
     // Creates and returns an instance of any object in the assembly by its type name. 
     object obj = null; 
     try { 
      if (objectName.LastIndexOf(".") == -1) { 
       //Appends the root namespace if not specified. 
       objectName = string.Format("{0}.{1}", Assembly.GetEntryAssembly.GetName.Name, objectName); 
      } 
      obj = Assembly.GetEntryAssembly.CreateInstance(objectName); 
     } catch (Exception ex) { 
      obj = null; 
     } 
     return obj; 
    } 

    public static Form CreateForm(Form objForm, string strName, string strAddr, string strCity) 
    { 
     // Return the instance of the form by specifying its name. 
     var objChild = (objForm)CreateObjectInstance(objForm.Name); 
     objChild.strName = txtName.Text1; 
     objChild.strAddr = txtAddress.Text2; 
     objChild.strCity = txtCity.Text2; 
     return objChild; 
    } 
} 

你可以稱之爲靜態函數來創建子窗體如下

objForm = ObjectFinder.CreateForm(frmChild1, strName, strAddr, strCity); 
objForm.ShowDialog(); 

解決方案2:

,或者簡單地創建擴展方法Form對象如下。

public static Form CreateForm(this Form objForm, string strName, string strAddr, string strCity) 
{ 
    // Return the instance of the form by specifying its name. 
    var objChild = (objForm)CreateObjectInstance(objForm.Name); 
    objChild.strName = txtName.Text1; 
    objChild.strAddr = txtAddress.Text2; 
    objChild.strCity = txtCity.Text2; 
    return objChild; 
} 

,並把這種擴展方法如下

objForm = frmChild1.CreateForm(strName, strAddr, strCity); 
objForm.ShowDialog(); 
0

的形式應該實現一個共同的接口(您定義),那麼你可以通過接口列表迭代(不管是什麼實現各形式有接口,做你想要的東西,比如像這樣:。

public interface IMyForm 
{ 
    string strName { get; set; } 
    string strAddress {get; set; } 
    string strCity { get; set; } 
    void ShowDialog(); 
} 

那麼如果所有的形式實現該接口主窗體可以保持在IMyForm列表中的所有子窗體的列表,只是循環並分配/顯示所有內容。

如果所有表格都具有相同的控件,您也可以編寫一個基地Form並繼承該表單中的其他表單並維護相同類型的列表。 如果表單只是在標題文本中有所不同,那麼您應該編寫一個表單,該表單具有所有表單實例所需的控件,並將不同的表單標題傳遞到其創建中。

+0

'void ShowDialog();如果所有元素都從'Form'繼承,''可以跳過。 – Flater

0

依靠什麼是您的需要,但你應該考慮增加所有形式的List<Form>創建的構造方法或工作。

優點可能是因爲你可以給他們打電話與enumeratorforeach

0

擴展在Skintkingle的answer, 您可以將Dictionary<object, Func<IMyForm>>添加到您的主要形式,將容納下拉列表中選擇的項目,因爲它是鍵和形式的構造,因爲它的價值:

private Dictionary<object, Func<IMyForm>> _SubForms = new Dictionary<object, Func<IMyForm>>() 
{ 
    {"Form1",() => {return new Form1();}}, 
    {"Form2",() => {return new Form2();} 
    //.... 
}; 

,然後在你點擊按鈕,所有你需要做的是這樣的:

var selectedItem = MyDropDown.SelectedItem; 
if(_SubForms.ContainsKey(selectedItem) 
{ 
    var form = _SubForms[selectedItem](); 
    form.strName = txtName.Text1; 
    form.strAddr = txtAddress.Text2; 
    form.strCity = txtCity.Text2; 
    form.ShowDialog(); 
}