2009-12-10 25 views
5

と同じように追加すると、System.Windows.Forms.Controlと同じようにSystem.Windows.Forms.ControlのLoadイベントを取得できますか?WinformsコントロールのLoadイベントをFormクラス

コントロールを最初に表示する前に、いくつかの初期化コードを実行します。

また、System.Windows.Forms.ToolStripStatusLabelでは、実際にはコントロールではありませんが、同じように動作することができればうれしいです。

理想的には、これを行うことができます: control.OnLoad(()=> {dosomething here;});

ここで、OnLoadは、「コントロール」が「読み込む」ときに引数Actionを実行する拡張メソッドです。

ありがとうございます!

答えて

4

Form.Loadイベントは、Controlクラスに属するOnCreateControlメソッドから呼び出されるOnLoadメソッドによって呼び出されます。フォームの呼び出しシーケンスは、次のようになりますので:

OnCreateControl start 
    OnLoad start 
     Form Load event call 
    OnLoad finish 
OnCreateControl finish 

を私はあなたのコンポーネントのOnCreateControlをオーバーライドして、そこにあなたの最適化コードを追加することができますね。

希望があれば、よろしく。

+0

ありがとうございます。あなたのアドバイスに続いて、ControlクラスのCreateControlイベントが見つかりました。このようなものがToolStripItemクラスにありますか? – deerchao

+0

新しいToolStripItem子孫を作成しようとしていますか?私は、コンストラクタに初期化コードを置くことができると思います –

+0

いいえ、コードは親と何か関係があります:ToolStripコントロール。コンストラクタではnullになります。 – deerchao

4

コントロールの場合、OnControlCreatedまたはOnHandleCreatedをオーバーライドできます。コントロールウィンドウを再作成する必要がある場合は、後者は複数回起動できます。コードがウィンドウ自体に影響を及ぼす場合は、必ずそれを使用してください。言い換えれば、Handleプロパティが必要な処理を行う場合。

ToolStripItem派生コントロールには適切な選択肢がほとんどありません。 SetVisibleCore()またはOnAvailableChanged()またはAvailableChangedイベントをオーバーライドすることをお勧めします。 ToolStripItemのVisibleプロパティが変更されたときに実行されます。初期化コードが既に実行されていることを追跡するboolフィールドを維持して、複数回起動することに注意してください。

コードで実際にコントロールを作成する必要がある場合は、これだけを実行してください。大部分のinitコードはコンストラクタに入ることができます。コードが実際の場所とコントロールのサイズに依存する場合は、Loadイベントが必要です。ターゲットマシン上の異なるシステムフォントまたはビデオDPI設定のためにフォームが再調整される場合は、デザイナーの値と異なる場合があります。

+0

ありがとうございます。私はそれをテストしましたが、期待どおりに動作しませんでした。 VisibleChanged/AvailableChangedイベントは、GetCurrentParent()がnullの場合に発生します。 – deerchao

0

TabPageにはTabControlの中でこのような解決策が必要でした。私が思い描いたのは、ペイントイベントハンドラを使用していたことだけでした。私はペイント用のイベントハンドラを追加し、最初の行でイベントハンドラを削除して、さらに初期化コードを実行します。これは、カスタムペイントをしていない場合にのみ機能します。また、カスタムペイントを行う必要がある場合は、Paint Executesを実行するたびにチェックするフラグを追加することもできます。

//Paint only runs once  
private void tabPage1_Paint(object sender, PaintEventArgs e) 
{ 
    tabPage1.Paint -= tabPage1_Paint;  
    //Do initialization here  
} 

///////////////////////////////////////////////////////////////////////////////// 

//Paint always runs 

private bool IsFirstPaint = true; 

private void tabPage1_Paint(object sender, PaintEventArgs e)  
{  
    if(IsFirstPaint) 
    { 
     IsFirstPaint = false;  
     //Do initialization here 
    }  
    //Do custom painting here 
} 
関連する問題