2011-01-12 43 views
12

私はマルチペイントフォームを持っています、左側のペインはツリーで、右側のペインはPanelです。ツリーの選択により、特定のUserControlsがパネルにロードされます。この場合、親フォームは常にロードされているので、親フォームのShowイベントにフックできません。表示された後、UserControlでメソッドを呼び出す方法?

私のUCの大半は、UCが作成されたときにデータを取り込む必要があるバインドされていないDataGridViewを持っています。 SQL Serverデータベースから、時には50,000行が正面に追加されることがあります。

これまで、私はUCコンストラクタでグリッドに値を設定しましたが、50,000行で作業を開始して以来、変更されています。私は、コンストラクタから50,000行のグリッドにデータを入力すると、何らかの狂気の理由で少なくとも15分かかります。しかし、ボタンをクリックするか、またはLoadイベントからグリッドを移入するまで待つと、15秒かかります。これは謎です。だから私はグリッドのローディングを他の場所に移そうとしています。

ただし、Loadイベントからグリッドにデータを入力しようとすると、視覚的に矛盾があります。どうしたら、私のUCの小さなバージョンが表示され、DGV行をロードするのに15秒かかり、その後UCがパネルを埋めるように展開されます(UC DockプロパティはFillに設定されています)。だから私はこのオプションも好きではない。

表示されたイベントは、UCのために存在する場合、グリッドをロードするのに最適な場所になります。誰かがこれを行う別の方法を知っていますか?

+1

それはコンストラクタでロードするために15分かかりますが、15秒の別の場所で、なぜ、より良い質問ですが。 – Justin

+1

おそらく、彼の人口ロジックがフォーム構築中に何度も変化するものに基づいて実行しているか、またはフォームロード時にいくつかのDGVをキャッシュに読み込んでいる可能性があります。 – KeithS

+0

これがなぜ起こっているのか、考えてみてください。私はむしろ以前のアプローチにとどまっています。コードはデータベース呼び出し(データは変更されていません)と1つのDGVの充填で構成されています。コンストラクタからの呼び出しとボタンからの呼び出しには違いがあります。コンストラクタはBackgroundWorkerスレッド内から呼び出されています。それがその原因かもしれませんか? –

答えて

16

同様の問題に対する私の答えは、グリッドが最初に目に見えるようになったときにDGVに入力することでした。これは遅延読み込みの本質です。最後の可能な秒で情報を取得します。

コントロールにShow()またはHide()が呼び出されたときに起動するVisibleChangedにフックするか、Visibleプロパティを手動で設定します。フィールドが現在表示されていて、コントロールが閉じている、または破棄されていない場合(この場合、いくつかの不自然な理由コントロールが表示される可能性があるため)、グリッド集団を実行します。

ここで必要なハンドラ、非常に簡単です:

protected override void OnVisibleChanged(EventArgs e) 
{ 
    base.OnVisibleChanged(e); 

    if (Visible && !Disposing) PopulateGridView(); //<-- your population logic 
} 
+0

ありがとう、私はこれは静的なサイズのUCで動作すると確信していますが、UCでコンテナに "完全"をドッキングするUCを試してみると、コンテナに合うようにUCがサイズ変更される前にグリッドが移入され、ミッドウェイのスクロールバーをグリッドの読み込みに15秒間押します。私は、UCがロードされた後にメソッドを呼び出すことによって、グリッドを読み込む方法を見つけました(最初に描画するためにDough Doogを使用する必要があります)。 –

+0

これは私が欲しいものに近いものですが、このロード時間はBackgroundWorkerの外で行われ、GUIの応答性は低下します(私が嫌う可能性のある(応答なし))。しかしこれは私の最善の解決策かもしれません。 –

+0

ハァッ。グリッドビューを備えた私のUCも塗りつぶされています。 PopulationLayoutとResumeLayoutを使用して、母集団が完成するまでウィンドウ要素の位置を一時停止してみてください。応答しない問題を解決するには、非同期ポピュレータルーチンとインターフェイスするデリゲートとイベントハンドラを使用してユーザーコントロールを設定します。 UCにBeginPopulateメソッドを開始させ、PopulateCompleteイベントにサブスクライブし、そのハンドラからグリッドフィル作業を行います。 – KeithS

関連する問題