2

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()および監視)別の種類の返品の場合)?

助けてくれてありがとう!

4

5 に答える 5

2

デフォルトでは、フォームは「すべてのアプリケーションの意味で」TopMostであってはなりません。その動作が見られる場合は、プロパティがデザイナで設定されている可能性があります。デザイナでプロパティの設定を解除するか、次のことを試してください。

using ( Form form = CreateMyForm() ) {
  form.TopMost = false;
  form.ShowDialog(parent);
  ...
}
于 2009-05-03T14:22:09.057 に答える
1

次のようなものを使用してください: 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");
        }

フォーム 2 :

   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 でキャッチできます;)

于 2009-05-03T13:18:54.857 に答える
0
paywindow.ShowDialog(this)

動作するはずです。追加のパラメータは、親がどのようになっているかを示し、親の上にレイヤーを作成しますが、最上位にはなりません。一番上とは、別のウィンドウをアクティブ化した場合でも、ウィンドウがデスクトップに固定されることを意味します。これは、ShowDialogのデフォルトの動作ではありません。JaredParが述べたように、フォーム/ウィンドウをTopMost=falseに設定してtrueにします。

于 2010-05-07T21:00:51.643 に答える
0

で表示されたときにフォームが一番上にならないようにする方法が見つかりませんでしたShowDialog()(これはフォームをモーダルとして示しており、それをオーバーライドする方法がわかりません)。

ただし、この StackOverflow questionでイベントをShow()監視することにより、 で示されている場合に 2 番目のフォームを監視する方法を見つけました。form.Disposed

イアンより:

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にイベントが発生しますが、これは私の状況では問題ありません。

于 2009-05-03T19:53:10.553 に答える
-1
paywindow.ShowDialog(this)
于 2009-05-03T12:54:06.537 に答える