2009-11-03 59 views
2

看起來在CF上沒有用於usercontrol的Load事件。CompactControl for UserControl上的No Load事件?

我習慣在Load EventHandler上加載數據。

爲了達到這個目的,CF還有其他的選擇嗎?

到目前爲止看起來像我別無選擇,只能在用戶控件的構造器這樣做......

回答

3

我刪除了我之前的回答,因爲這是絕對的垃圾。你100%正確,CF沒有Load事件。事實證明,當我編寫UserControl時,我自己發現了這一點。我查找了一箇舊項目的加載事件,其中我所有的用戶控件都從我自己的基類繼承而來......名爲UserControlBase。

我似乎在我的基類中實現了我自己的Load功能。這是我的基類的削減版本:現在

public class UserControlBase : UserControl 
{ 

    public UserControlBase() { } 

    public event EventHandler Load; 

    private void Loaded() 
    { 
     if (this.Load != null) 
     { 
      this.Load(this, new EventArgs()); 
     } 
    } 

    public new void ResumeLayout() 
    { 
     this.Loaded(); 
     base.ResumeLayout(); 
    } 

    public new void ResumeLayout(bool performLayout) 
    { 
     this.Loaded(); 
     base.ResumeLayout(performLayout); 
    } 

} 

,在實際的用戶控件,請執行下列操作:

public partial class UserControl1 : UserControlBase 
{ 

    public UserControl1() 
    { 
     InitializeComponent(); 
    } 

    private void UserControl1_Load(object sender, EventArgs e) 
    { 

    } 

} 

這是一個非常古老的項目。在後來的項目中,我傾向於在中調用用戶控件的.Load()方法。

+0

謝謝,我想我會在用戶控件一個簡單的Load方法去。在表單中,它將調用加載方法。 – pdiddy 2009-11-03 18:29:11

+0

聽起來像一個很好的計劃! – GenericTypeTea 2009-11-04 07:11:26

+0

嗯......這是什麼工作?如果引用了顯式的類型定義,「new」只會覆蓋該調用。如果通過UserControl或Control調用.ResumeLayout(),則不會調用「新」版本。 – Quibblesome 2009-11-06 20:02:40

0

您可以使用EnabledChanged事件,並檢查控制首次啓用:

private void UserControl1_EnabledChanged(object sender, EventArgs e) 
{ 
    if (Enabled && firstTime) 
    { 
     firstTime= false; 
     //DO init 
    } 
} 
-1

我會使用OnHandleCreated,但請記住,可以重新創建Control的句柄。

E.x:

 


private bool _loaded; 

protected override void OnHandleCreated(EventArgs e) 
{ 
base.OnHandleCreated(e); 
if(!_loaded) 
{ 
_loaded=true; 
DoLoad(); 
} 
} 

private void DoLoad() 
{ 
} 

 
+0

OnHandleCreated()在InitializeComponent()之前調用! 我建議在InitializeComponent()之後調用DoLoad()。 – 2016-03-06 16:27:49