2011-01-27 19 views
0

サーバーエクスプローラーでVisual Studio 2008の[データベースに接続]フォームと非常によく似た設定フォームを作成しています。以下のように設定フォームが親フォームからモーダルダイアログとして開かれWindows Form Combobox DropDownイベントによりダイアログフォームのフォーカスが失われる

:SettingsFormオン

private void settingsToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     var SettingsForm = new frmSettings(); 
     SettingsForm.ShowDialog(this); 
    } 

を、私は介してネットワーク上で利用できるSQLServerのインスタンス名とそのリストに移入されますコンボボックスを持っていますドロップダウンイベントに次のコード:

private void cboTrackingServerName_DropDown(object sender, EventArgs e) 
    { 
     DataTable dt = SmoApplication.EnumAvailableSqlServers(false); 
     if (dt.Rows.Count > 0) 
     { 
      cboTrackingServerName.Items.Clear(); 

      foreach (DataRow row in dt.Rows) 
      { 
       cboTrackingServerName.Items.Add(
        row["Server"] + "\\" + row["Instance"]); 
      } 
     } 
    } 

問題は、ユーザーがコンボボックスのドロップダウン矢印をクリックするたびに、SettingsFormが迅速秒間その親フォームにフォーカスを失う、SettingsForm自体を再描画するように見えるということですとSettingsFormがフォーカスを取り戻します。また、実際のドロップダウンリストは、ユーザーが再度クリックするまで表示されません。

この問題に関するご意見はありますか?

+1

コンボボックスの人口をダイアログフォームのForm_Loadに移動できますか? –

+0

@David McEwing:はい、しかし、私はむしろそうしたくありません。 SmoApplication.EnumAvailableSqlServersからDataTableをロードすると、少し遅れてForm_Loadが数秒間ハングします。私はむしろ、ユーザーが実際に値を変更したいときに、遅延を隔離したいと思っています。 –

+0

Form_Loadからバックグラウンドスレッドを開始し、そこにダイアログを設定する方法はありますか? Form_Loadはすぐに完了し、DropDownイベントでそれを行うのが間違った場所になります。 ASP.NETでは、私はDataBoundでそれを行い、page_loadからBind()メソッドを呼び出します。それはこの状況でうまくいくのだろうか? –

答えて

0

これは、Form_Loadのようなダイアログのライフサイクルの早い段階で行うべきでしょう。また、ここでそれをする必要があったとしても、リストを再ロードしないでください。リストが既にロードされているかどうかを確認してください。それ以外の場合は、ユーザーがドロップダウンを開くたびに現在の選択範囲を消去します。

+0

ありがとうございます。私はリストチェックとSelectedItemロジックを既に用意していますが、私が持っているバグとは無関係です。私が掲示したものは、市場性のある最小限のバグです;)@David McEwingの上記のコメントを参照してください。 –

+0

作業をバックグラウンドスレッドまたは非同期スレッドに移動することは良い考えです。あなたはそこからドロップダウンにアイテムを追加すべきではありません。これはUIのthreadBackgroundWorkerから行う必要があります。 http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker。aspxワーカーに呼び出しを行い、DropDownのリストをRunWorkerCompletedイベントに返します。 – bigtlb

+0

ありがとう、bigtlb - それは素晴らしい仕事。上記のコメントを参照してください。 –

0

利用可能なサーバーインスタンスを取得するためにDropDownイベントを使用する代わりに、Form.Loadイベントを使用することをお勧めします。

ただし、ユーザーがドロップダウンを開いたときに何らかの理由でリストを埋める場合は、ComboBox.Clickイベントを使用する必要があります。

コンボボックスをクリックしてドロップダウンを開くと、最初にクリックイベントが発生してからドロップダウンイベントが発生するため、ドロップダウンが更新されなくなります。しかし、ドロップダウンのクリックとオープンにはまだ少しの時間差があります。迅速で完璧な解決策を得るには、フォームロードイベントを使用します。

+0

クリックイベントは、残念なことに同じ遅延を引き起こします。 backgroundWorkerと組み合わせたForm_Loadは問題を解決しました。 –

関連する問題