画面に [お待ちください] ボックスが表示されている間、メイン フォームをロックしようとしていますが、機能しません。これが私のジレンマです。
私は2つのフォームを持っています。ユーザーが更新ボタンをクリックして SQL Server のリストをロードするメイン フォームと、リストのロード中に表示される [お待ちください] フォーム。C# を使用している場合、SQL Server スレッドは既定で別のスレッドであり、SQL 要求を処理するためにメイン スレッドをロックアウトします。
バックグラウンド ワーカーを追加できますが、コンボ ボックスを更新してリストを UI コントロールとして表示することはできません。そのためのハンドラーを使用すると、しばらくお待ちくださいボックスの show_dialog() がメイン フォームのロックを停止します。
メインスレッドが再びアクティブになった後、左クリックキューが実行されずに、このフォームをロックダウンすることはどのように可能でしょうか? ユーザーが待機している間に実行する必要があるコードを追加しました。
public void PullServers()
{
bool ServersFound = false;
foreach (string Value in SQL.LocateSqlInstances())
{
this.cmbServer.Items.Add(Value);
ServersFound = true;
}
if (!ServersFound)
{
this.cmbServer.Items.Add(Strings.Lang("ddServerNoneFound"));
this.cmbServer.SelectedIndex = 0;
}
else
{
if (!s.empty(General.setting("SQLSERVER")))
{
this.cmbServer.Text = General.setting("SQLSERVER");
}
else
{
this.cmbServer.SelectedIndex = 0;
}
}
this.picRefreshServers.Image = Properties.Resources.Refresh;
}
public static Array LocateSqlInstances()
{
using (DataTable sqlSources = System.Data.Sql.SqlDataSourceEnumerator.Instance.GetDataSources())
{
string Servers = null;
foreach (DataRow source in sqlSources.Rows)
{
string instanceName = source["InstanceName"].ToString();
if (!s.empty(instanceName))
{
Servers += source["ServerName"].ToString() + "\\" + instanceName + "[[SERVBREAK]]";
}
}
string[] ServersList = Servers.Split(new string[] { "[[SERVBREAK]]" }, StringSplitOptions.RemoveEmptyEntries);
return ServersList;
}
}