私はかなりよく構造化された.NET 3.5フォームアプリケーション(ユニットテスト、依存性注入、SoC、フォームは単に入力と出力をリレーし、ロジックは何もしません)と思っています。このビットをどのように動作させるかについてwinformsの知識があります。Windowsフォーム:ユーザーではなくアプリケーションによって開閉されるモーダルフォーム?
頻繁に発生するデータベースへの接続が失われた場合、これを検出して処理しています。接続が再確立されるまで、アプリケーションの使用をブロックするモーダルフォームがポップアップされます。私はユーザーの入力を待っているわけではなく、タイマーを使用してデータベースをポーリングしているので、これを行う方法は100%確信していません。私の試み
がその上にラベルでフォームを設計し、これを実行することでした:これは_dialog.Close()以降は動作しません
partial class MySustainedDialog : Form {
public MySustainedDialog(string msg) {
InitializeComponent();
lbMessage.Text = msg;
}
public new void Show() {
base.ShowDialog();
}
public new void Hide() {
this.Close();
}
}
public class MyNoConnectionDialog : INoConnectionDialog {
private FakeSustainedDialog _dialog;
public void Show() {
var w = new BackgroundWorker();
w.DoWork += delegate {
_dialog = new MySustainedDialog("Connection Lost");
_dialog.Show();
};
w.RunWorkerAsync();
}
public void Hide() {
_dialog.Close();
}
}
クロススレッド呼び出しがあります。私はWindowsフォーム内でこの問題を解決する方法に関する情報を見つけることができましたが、フォーム自体を作成する必要があるこのような状況ではありません。
私がやろうとしていることを達成する方法を教えてもらえますか?
EDIT:私はUIのスレッドは、私は提案を完全に開いていますので、どのように働くかと途方もなく慣れていないだから注意してください、私は他のアイデアの不足のためにバックグラウンドワーカーを試してみました。また、現在作業しているフォームを閉じたくないことに気付く必要があります。これをその上に表示したいだけです。 OK/Cancelダイアログボックスと同様ですが、プログラムで開いて閉じることができます(そして、それはどのようなものかを制御する必要があります)
私は現在のフォームを閉じる必要はありませんが、その上にno connectionフォームが必要です。それ、どうやったら出来るの? –
NoDatabaseFormフォーム=新規NoDatabaseForm(); form.ShowDialog(); アクティブなフォームの前に表示する必要があります。 –
タイマーハンドラを実装する場合はいつでも、フォームにアクセスできる必要があります。そのため、データベースが戻ったときに再び閉じることができます。多分あなたの依存性注入などは混乱しているかもしれません。とにかくこれを行うことができる最小のアプリを書こうとすると、それをあなたのアプリに入れてください –