ShowDialog()を最上位にしないように設定できますか?
-
03-07-2019 - |
質問
ShowDialog()を最上位にしないように設定する方法はありますか?関連するすべてのSOの質問を調べましたが、私の状況に一致するまったくものはありませんでした。
私がしているのは、datagridviewボタン列から新しいWinFormを開くことです。この新しいフォームは、いくつかのSQLiteテーブルから情報を取得し、ユーザーがボタンをクリックした行に情報を追加できるようにします。
以下のコードを使用してWinFormを開きます。 ShowDialog()メソッドを使用して、ユーザーがフォームに情報を保存するかキャンセルするかを判断できるようにします。
Pay_Bill_Window paywindow = new Pay_Bill_Window(getClickedRowID);
if (paywindow.ShowDialog() == DialogResult.OK)
{
FillPendingPaymentDataGrid(dbAccess.GetPendingBills());
}
これを行うと、datagridviewの情報を再ロードする必要があるかどうかを判断できます。
ユーザーがウィンドウに入力できる情報は、Webブラウザーなどの他のソースからのものであるため、すべてのアプリケーションの上にフォームを配置することは理想的ではありません。
すべてのアプリケーションの上にウィンドウが表示されないようにする方法はありますか(私の一連のウィンドウの一番上でも構いません)、ユーザーが別のフォームをクリックしたボタンを知る方法があります(基本的に、 paywindow.Show()
を使用して、異なるタイプのリターンを監視していますか?
ご協力ありがとうございます!
解決
次のようなものを使用します。 form1:
private void button1_Click(object sender, EventArgs e)
{
Form2 frm = new Form2();
frm.Show();
frm.FormIsClosing += frm_FormIsClosing;
}
void frm_FormIsClosing(object sender, DialogResult rsl)
{
if (rsl == System.Windows.Forms.DialogResult.Yes)
MessageBox.Show("We got it");
}
form2:
public delegate void IsClosing(object sender, DialogResult rsl);
public event IsClosing FormIsClosing;
private void Form2_FormClosed(object sender, FormClosedEventArgs e)
{
FormIsClosing(this, System.Windows.Forms.DialogResult.Yes);
}
その後、form2を閉じ、FormIsClosingが起動し、from1でキャッチできます;)
他のヒント
デフォルトでは、「すべてのアプリケーションの意味」でフォームをTopMostにしないでください。この動作が見られるのは、おそらくデザイナーでプロパティが設定されているためです。デザイナーでプロパティの設定を解除するか、次を試してください。
using ( Form form = CreateMyForm() ) {
form.TopMost = false;
form.ShowDialog(parent);
...
}
ShowDialog()
で表示されたときにフォームが一番上にならないようにする方法を見つけていません(これはフォームをモーダルとして表示し、オーバーライドする方法がわかりませんそれ)。
しかし、 Show()
で表示されるときに、2番目のフォームを監視する方法を見つけました。 「https://stackoverflow.com/questions/677056/opening-forms-in-c」>このStackOverflowの質問。
Ian から:
Form2 form2 = null;
void button_click(object sender, EventArgs e)
{
if(form2 == null)
{
form2 = new Form2();
form2.Disposed += new EventHandler(f_Disposed);
form2.Show();
}
}
void f_Disposed(object sender, EventArgs e)
{
form2 = null;
}
私が知る限り、これは( DialogResult
のように)フォームが閉じられた理由を確認できないため、イベントは everything ごとに発生しますフォームが閉じます。これは私の状況では問題ありません。
paywindow.ShowDialog(this)
動作するはずです。追加のパラメーターは、親がどのようになっているかを示し、親の上にレイヤーを作成しますが、最上位にはレイヤーを作成しません。最上位とは、別のウィンドウをアクティブにした場合でも、ウィンドウがデスクトップ上に残ることを意味します。これは、ShowDialogのデフォルトの動作ではありません。 JaredParが述べたように、フォーム/ウィンドウをTopMost = falseに設定してtrueにします。
paywindow.ShowDialog(this)