2012-02-17 9 views
1

私はユーザーがフォームにドロップできる.NETコントロールを持っています。コントロールがいつ初期化されたのか分かりますか?

Visual Studioはホスティングフォームのコンストラクタから呼び出されInitializeComponentを作成します。

public EditItemForm() 
{ 
    InitializeComponent(); 
} 

この自動生成方法は、自動生成されたファイルには、デザイナーのserializiblityルールに基づいて、私のコントロールを初期化します。例えば:

private void InitializeComponent() 
{ 
    ... 
    this.lvResults = new Contoso.Controls.VirtualGrobber(); 
    ... 

    // 
    // lvResults 
    // 
    this.lvResults.BorderStyle = System.Windows.Forms.BorderStyle.None; 
    ... 

    //FrobGrobberForm 
    ... 
    this.Controls.Add(this.lvResults); 
    ... 
} 

どのようにすべてのデザイナーのシリアル化が行われたときに、私は、誰かのフォームの上に座ってコントロールが、知っている、と私は「準備完了」ですができますか?

は、それがストリームからロードされた後に制御を初期化:Delphiで


、自動制御でシリアル化メカニズムは、各コントロールのLoadedメソッドを呼び出します。

procedure Loaded; override; 

説明

VCLストリーミングシステムコール コントロールがフォーム内の他の のオブジェクトに依存するすべての初期化を完了できるように、コントロールのフォームがメモリにロードされた後、自動的に をロードしました。あなたはControl.OnControlCreatedメソッドをオーバーライドすることができます:あなたはWinFormsのControlクラスについて尋ねると仮定すると、

+1

これを行う方法はいくつかあります。どちらが慣用的であるか適切であるかは、実際にあなたが初期化しようとしているものによって決まります。もちろん、デザイナーは何も魔法を使わないで、あなたのコントロールのプロパティを設定するだけです。また、カスタムコントロールを設計する標準的なルールは、ユーザーまたはデザイナーのいずれの順序でもプロパティを設定できる必要があることです。 –

+3

ISupportInitializeインターフェイスを実装します。 –

+0

@ HansPassant 私はISupportInitializeを実装し、EndInit()にコードを入れましたが、決して呼び出されません。 ISupportInitializeを実装する必要がありますか?私はそれを取り戻す。 * 2回*をビルドすると、デザイナーは 'InitializeComponent'中に' EndInit() 'を呼び出します。本当に答えの形でそれを語るべきです。 –

答えて

1

ISupportInitializeインターフェイスを実装します。 Visual Studioはフォームデザイナーのコードファイルにコードを追加し、すべてのコンポーネントのプロパティの設定が完了したらEndInitを呼び出します。

1

。別の選択肢は、基礎となるグラフィックオブジェクトが作成されたときに呼び出されるControl.OnHandleCreatedメソッドをオーバーライドすることです。あなたがしたい場合

が、それはすぐにControlを実行:

0

も...あなたは、いくつかのコードがControlが「準備完了」であるときに実行したいと仮定すると、ParentChangedイベント

private void VirtualGrobber_ParentChanged(object sender, EventArgs e) 
{ 
    try 
    { 
     Form frm = this.FindForm(); 
     if (frm != null && !frm.IsDisposed) 
      frm.Load += new EventHandler(frm_Load); 
    } 
    catch (Exception ex) 
    { 
     //Do something 
    } 
} 

private void frm_Load(object sender, EventArgs e) 
{ 
    //Do what you want 
} 
0

にそれを検出することができますフォームが表示される前であっても「準備完了」です。フォームのコンストラクタにInitializeComponent();の後にコードを追加します。 (それは単にControl年代などを作成する方法です)

したい場合は、フォームが表示されたときに追加し、実行:フォームのコンストラクタで

Shown += Form1_Shown; 

を、そして:

void Form1_Shown(object sender, EventArgs e) 
{ 
    //code to execute. 
} 

フォームのクラスにあります。

関連する問題