サーバーエクスプローラーで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がフォーカスを取り戻します。また、実際のドロップダウンリストは、ユーザーが再度クリックするまで表示されません。
この問題に関するご意見はありますか?
コンボボックスの人口をダイアログフォームのForm_Loadに移動できますか? –
@David McEwing:はい、しかし、私はむしろそうしたくありません。 SmoApplication.EnumAvailableSqlServersからDataTableをロードすると、少し遅れてForm_Loadが数秒間ハングします。私はむしろ、ユーザーが実際に値を変更したいときに、遅延を隔離したいと思っています。 –
Form_Loadからバックグラウンドスレッドを開始し、そこにダイアログを設定する方法はありますか? Form_Loadはすぐに完了し、DropDownイベントでそれを行うのが間違った場所になります。 ASP.NETでは、私はDataBoundでそれを行い、page_loadからBind()メソッドを呼び出します。それはこの状況でうまくいくのだろうか? –