2015-05-20 52 views
0

我有一個用戶控件,Load事件發射得太早。用戶控件有一些傳入構造函數的對象,並有一個加載事件。Form.Load提早觸發

public int num; 
public String value; 

public myControl(int num, String value) 
{ 
    InitializeComponent(); 
    this.num = num; 
    this.value = value; 
} 

private void MyControl_Load(object sender, EventArgs e) 
{ 
    sometextbox.Text = value; 
    someothertextbox.Text = num.ToString(); 
} 

我的問題是,無論何時調用控件,initialize都會調用Load事件太早。走向的InitializeComponent()在Designer.cs結束,它使用此代碼

this.Load += new System.EventHandler(this.MyControl_Load); 

,右加Load事件到控制它增加了事件處理程序之後,它進入的事件。所以,如果我不得不在設計這樣的事情...

Some code 1 
Some code 2 
this.Load += new System.EventHandler(this.MyControl_Load); 
Some code 4 
Some code 5 

它實際上將跳出在InitializeComponent()和去運行,MyControl_Load,回來與somecode4和somecode5整理出來了。

這不會是一個正常的問題,因爲Load只是設置一些文本框,但它們使用通過構造函數傳入的值,並且由於值在initializeComponent()後設置,所有內容都剛剛結束up爲NULL。

簡短的回答是把this.num = numthis.value = value以上InitializeComponent調用(),但此相同的方法適用於多個其他用戶控件,而我只是好奇,爲什麼這個方法沒有這方面的工作用戶控制。

+0

你所描述的內容聽起來不可能。註冊事件處理程序不會立即調用該事件處理程序。你有沒有在調試器中放置一個斷點'this.Load + = new System.EventHandler(this.MyControl_Load);'並通過它來追蹤? – adv12

+0

這些文本框是您的自定義控件的子項嗎? – Powerlord

+0

問題中沒有提示,你必須發佈repro代碼。或者只是不打擾,因爲在這種情況下使用Load事件是錯誤的,請將代碼移到構造函數中。 –

回答

2

我同意adv12,這可能不是實際發生的事情;全部this.Load += new System.EventHandler(this.MyControl_Load);確實是註冊這個事件,實際上並沒有開火。

話雖如此,請記住,設計師只是一個工具,爲您生成代碼。如果您想要更多的控制權,您可以自己做任何設計師所做的事情(以及更多!)。

所以,如果你有出了問題,而不是在設計師加入Load事件,改變你這樣的代碼:

public int num; 
public String value; 

public myControl(int num, String value) 
{ 
    InitializeComponent(); 
    this.num = num; 
    this.value = value; 
    InitializeTextboxes(); 
} 

private void InitializeTextboxes() 
{ 
    sometextbox.Text = value; 
    someothertextbox.Text = num.ToString(); 
} 

您可能需要閱讀漢斯帕桑特的回答here以及你應該/不應該在構造函數中做什麼。

+0

是的,那是我考慮過的另一件事,但我仍然好奇事件處理程序寄存器如何最終調用加載函數 –