2010-02-15 34 views
1

我有一個組件與處理一些內部翻譯的另一個組件發生衝突。在.NET WinForms的Form_Load事件之前或之後執行組件代碼?

會發生什麼情況是業務邏輯組件被執行,然後執行翻譯系統,該系統會讀取表單中現有的文本並嘗試翻譯它們。

問題是文本現在包含諸如數字,日期,數據庫相關文本等內容,但在執行業務邏輯之前,這些控件是空白或包含爲翻譯準備的虛擬文本。

我想知道如何讓我放在窗體上的組件在窗體的生命週期的特定時間執行它的代碼。例如,如果我從業務邏輯組件中刪除有問題的代碼,以便在構建時不做任何事情,然後進行翻譯工作,如果我然後調用該方法,我將該代碼從Form_Load中移出,太好了。

所以我想知道,對於我來說,是否有一種方式可以從組件(即從Component下降,而不是可視化控件),在Form_Load之前或之後執行代碼,或者至少在所有其他組件之後執行代碼控制已經建立?

它似乎沒有從組件內部回到窗體的任何鏈接,所以對於我來說鉤入Load事件似乎也不可能。

還是我吠叫錯了樹?

回答

2

我不清楚爲什麼你不能通過從窗體的Load事件處理程序顯式調用組件的方法來解決這個問題。

使組件知道它被刪除的表單是可能的。設計者可以被誘騙來初始化組件的屬性到表單實例。這是ErrorProvider使用的一種技術,例如,它繪製表單上的錯誤圖標。這可以通過擴展讓組件訂閱表單的Load事件。這裏有一個例子:

using System; 
using System.ComponentModel; 
using System.ComponentModel.Design; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 { 
    public partial class Component1 : Component { 
    public Component1() { 
     InitializeComponent(); 
    } 
    public Component1(IContainer container) { 
     container.Add(this); 
     InitializeComponent(); 
    } 

    [Browsable(false)] 
    public ContainerControl Host { 
     get { return mHost; } 
     set { 
     if (mHost == null && value as Form != null && !DesignMode) { 
      (value as Form).Load += Initialize; 
     } 
     mHost = value; 
     } 
    } 
    private ContainerControl mHost; 

    public override ISite Site { 
     set { 
     base.Site = value; 
     if (value != null) { 
      // Assign Host at design time 
      IDesignerHost service = value.GetService(typeof(IDesignerHost)) as IDesignerHost; 
      if (service != null) { 
      IComponent rootComponent = service.RootComponent; 
      this.Host = rootComponent as ContainerControl; 
      } 
     } 
     } 
    } 
    private void Initialize(object sender, EventArgs e) { 
     Console.WriteLine("initializing..."); 
    } 
    } 
} 
+0

我們已經有很多形式,我希望避免回去和添加代碼將它們全部解決這個問題,但似乎是最正確的方式來解決這個問題是這樣做的。我會研究你發佈的代碼。 –

+0

您發佈的代碼解決了問題。對於現有的表單,我必須返回並手動設置主機屬性,並使用您發佈的代碼,新表單將自動修復此問題。謝謝! –

相關問題