2010-08-06 50 views
2

我有一個插件式結構的應用程序。 所有申請表格從基站用戶控件繼承:加載事件沒有從從另一個程序集加載的繼承用戶控件中觸發(Winforms)

public class BaseUserControl : UserControl 
{ 
// some common properties and methods 
// 
protected override void OnLoad(EventArgs e) 
{ 
    base.OnLoad(e); 
} 
} 

並且在不同的組件被編譯。

當我想表明一種形式,它通過這個序列:

assembly = Assembly.LoadFile(assemblypath); 
. 
. 
frm = (BaseUserControl)assembly.CreateInstance(frmname); 
. 
. 
SomeContainer.Controls.Add(frm); 
MainScreen.Controls.Add(SomeContainer); 

這些形式常見的結構是:

public class TestForm : BaseUserControl { 
    public TestForm(){InitializeComponent();} 
    private void InitializeComponent(){ 
. 
. 
    this.Load += new System.EventHandler(this.TestForm_Load); 
. 
    } 
    private void TestForm_Load(object sender, EventArgs e){} 

} 

的問題是,這些形式的Load事件不不會被解僱。

另一個行爲,我不明白如何,當在基類的OnLoad中設置斷點時,調用堆棧顯示從InitializeComponent中調用。

關於如何解決這個問題的任何想法?

回答

3

你絕望地混淆了Form和UserControl這兩個詞,很難給出一個很好的答案。他們是非常不同的野獸,你不能把UC變成一種形式。它是一個客戶端窗口,而不是頂層窗口。我懷疑這與你的問題有關,但通用的診斷是有人重寫OnLoad而不是調用base.OnLoad()。

是的,可以從InitializeComponent()中的代碼調用OnLoad。由於OnLoad將在構造函數完成之前運行,因此它不是非常健康,但它是受支持的。當您觸摸需要創建句柄的屬性時,會發生這種情況。調用堆棧應該向您顯示哪些特定的屬性分配完成此操作,只需雙擊調用堆棧中的行即可。

+0

謝謝你的回答。 事實上,術語表和用戶控件的混合是由於法語翻譯;我的意思是通過形成應用程序屏幕,但從技術上講,有一個主要的system.windows.forms.form,一切都駐留在用戶控件中。 包含Web瀏覽器的模塊發生錯誤(部分應用程序已在asp.net中),並且在創建事件處理函數之前,該基本用戶控件Load事件正好在該Web瀏覽器插入到控件集合中時調用。 – RMS 2010-08-08 14:27:05

相關問題