2009-07-29 22 views
1

フォームに動的に読み込まれるテキストボックスを含むusercontrolがあります。 フォームの起動時に私はusercontrolを開始し、可視性タグを 'false'に設定します。 このメソッドは、ユーザーコントロールが可視になったときにメソッドを自動的にトリガーします。このメソッドはテキストボックスに出力を書き込むため、このメソッドはusercontrolとすべての継承コントロールがユーザーに表示された後にのみ実行します。

paintEventHandlerは、コントロールの可視性が変更された後に、フォームとその継承されたコントロールが再描画されたときにトリガーされる最後のイベントであると考えました。

したがって、paintEventHandlerを購読すると、フォームが完全に再描画された後にサブスクライブされたメソッドがトリガーされるはずですが、明らかにそうではありません。

これについてのご意見はありますか?usercontrolが完全に表示された後にメソッドを実行する方法

private void processControl_SetActive(object sender, CancelEventArgs e) 
     { 

      this.BeginInvoke((MethodInvoker)delegate 
      { 
       this.Paint += new PaintEventHandler(processControl_Paint); 
      }); 

     } 

void processControl_Paint(object sender, PaintEventArgs e) 
     { 
      //Should only be called when everything is fully loaded and visible on the form. 
      //Application.DoEvents() ->probably bad idea?? 
      AddStuffToTextBox(); 
     } 
+1

あなたはより高いレベルから何を達成しようとしていますか?たとえば、テキストボックスが表示されていないときにテキストボックスにテキストを追加するのは容認できないのですか?あなたが質問で概説したアプローチとは異なるアプローチを含むかもしれない実際の問題を解決しようとするのを手伝ってください。 – Eric

+0

実際に問題はありません。しかし、テキストボックスにテキストを追加するときに、ユーザーが実際にテキストボックスを最初から塗りつぶすのを見ている間に、ある遅延を持つ行の後にテキストを追加するとよいでしょう。これで、フォームがロードされている間にテキストボックスに書き込まれた行が、処理が終了した直後に表示されるようになりました。 'visibleChanged'イベントに登録することは明らかにトリックを行いません。 「すべてのUIイベントの読み込みと処理が完了しました。あなたは今、フォームにコントロールを追加/使用できます」というイベントを探しています。 – Mez

答えて

2

VisibleChangedを参照してください。

+0

フォームのライフサイクルのリンクを参照してください。 'VisibleChanged' getは、 'Paint'イベントの前にトリガされるため、これは機能しません。 http://www.c-sharpcorner.com/UploadFile/mamta_m/WindowsFormsLifecycle11182008235227PM/WindowsFormsLifecycle.aspx – Mez

+0

Form.VisibleChangedではなく、UserControlの表示が変更された状態で登録します。 – Guillaume

+0

はい、これはユーザーコントロール上で動作します。 – Charles

0

コントロールのVisibleChangedイベントを購読するか、OnVisibleChangedを上書きできます。ユーザーコントロールが表示されているときにのみコードを呼び出すには、postメソッドがコントロールメッセージキューに呼び出します。あなたのケースでVisibleChangedが失敗した場合はPaintイベントで試してみることもできますが、そうは思わないです。なぜ、BeginInvoke経由でイベントを追加するのですか?

あなたは確認してたときにコントロールが入力フォーカスを取得して、コントロールをアクティブ化コード内で呼び出す火災ユーザーコントロールのEnterイベントのためにハンドラにテキストボックスの初期化コードを追加してみてください可能性が
void OnVisibleChanged(EventArgs e) 
{ 
    //Should only be called when everything is fully loaded and visible on the form. 
    //Application.DoEvents() -> actually bad idea!! 
    if (IsHandleCreated) 
     BeginInvoke(new MethodInvoker(AddStuffToTextBox)); 
    base.OnVisibleChanged(e); 
} 
2

コントロールにフォーカスを当ててアクティブに設定する方法。おそらくフラグを保持して、入力フォーカスを取得したコントロールの最初のオカレンスでのみ行われるようにします。

0

あなたが本当にやりたいことは、行単位でテキストボックスを埋めることですから、VisibleChangedイベントが発生したときにタイマーを開始することをお勧めします。タイマーのTickイベントでは、テキスト行を追加できます。最初のタイマーの目盛の前に長時間待つ必要がある場合は、タイマーの遅延を長く設定してから、Tickイベントハンドラで最初に減らします。

関連する問題