[英]Call Winforms Form Constructor Dynamically C#
我有兩個 BaseForms:BaseFormListView 和 BaseFormDetailView,它們提供分頁和搜索,以及其他應該在 forms 中可用的細節,這些細節是由它們派生的。 以下派生的 forms 實現了一個國家/地區的 CRUD 操作所需的特定行為/字段:
public partial class frmCountry: BaseFormListView
public partial class frmCountryDetailView: BaseFormDetailView
在進一步抽象時,我發現我不知道如何歸檔我想要的東西。 在我的實現中的某個地方,我需要具體並希望像這樣動態調用構造函數:
Form oReadWindow = new DetailForm(FormModus.READ, ulID); oReadWindow.ShowDialog(this);
當單擊列表的條目時,這應該在 BaseFormListView 中發生,如果用戶根據其 ID (ulID) 請求創建、讀取、更新或刪除所選記錄集,我需要根據 FormModus 做出決定。
所以代替“new DetailForm(FormModus.READ, ulID);” 我需要調用任何派生的 DetailView 的構造函數,無論是 frmCountry(如示例中所示)還是 frmArea 或 frmUser 或此特定上下文所需的任何 DetailForm。
我試過這個var objectHandle = Activator.CreateInstance("MyApp", Form, new object[] { FormModus.READ, ulID });
但編譯器告訴我在這種情況下不允許使用 Form 類型。
我應該如何解決這個問題?
謝謝,斯蒂菲
編輯:這里有更多細節以便更好地理解。
實際上這就是我所擁有的: var objectHandle = Activator.CreateInstance("MyApp", DetailFormName, new object[] { FormModus.READ, ulID });
Form oReadFenster = (Form)objectHandle.Unwrap();
當我不使用 CreateInstance 中的第一個參數時,我收到錯誤“無法從字符串轉換為類型表單”
這是 DetailFormName 的定義: protected String DetailFormName { get; set; } // in BaseFormListView
protected String DetailFormName { get; set; } // in BaseFormListView
初始化值是這樣提供的: base.DetailFormName = "frmCountryDetailView"; // in the constructor of frmCountryDetailView
base.DetailFormName = "frmCountryDetailView"; // in the constructor of frmCountryDetailView
中:public partial class frmCountry: BaseFormListView
這個想法是在每個 DetailForm(即 frmUser)中設置 base.DetailFormName 不同,這將進一步從 BaseFormListView 派生,BaseFormListView 本身為從它派生的每個 XYListView 提供分頁 DGV 和可配置搜索和其他東西。
不過,我得到: System.TypeLoadException: 'Der Typ "frmCountryDetailView" in der Assembly "MyApp, Version=0.0.0.1, Culture=neutral, PublicKeyToken=null" konnte nicht geladen werden.'
我認為不需要 CreateInstance。 調用您的 frmCountryDetailView 作為它自己的專用實例,例如:
frmCountryDetailView oReadWindow = new frmCountryDetailView(ulID);
oReadWindow.ShowDialog(this);
並修改 frmCountryDetailView 的構造函數,如:
public frmCountryDetailView(int uID) : base(FormModus.READ, ulID)
{
InitializeComponent();
// etc
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.