簡體   English   中英

動態調用 Winforms 表單構造函數 C#

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM