我可以将ShowDialog()设置为不是最顶层的吗?

时间:2009-05-03 12:48:26

标签: c# winforms show showdialog topmost

有没有办法可以将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中重新加载信息。

用户可以填写到窗口的信息来自其他来源,例如网络浏览器,因此将表单放在所有应用程序之上是不理想的。

有没有办法可以阻止窗口在所有应用程序之上(我的系列窗口中最顶层的很好),或者有办法告诉用户点击另一个窗体的按钮(基本上,使用paywindow.Show()并观察不同类型的回报)?

感谢您的帮助!

5 个答案:

答案 0 :(得分: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");
        }

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 fires你可以从in1中获取它;)

答案 1 :(得分:1)

默认情况下,表单不应该是“for all applications sense”中的TopMost。如果您看到这种行为,可能是因为该属性是在设计器中设置的。要么在设计师中取消设置属性,要么尝试以下操作。

using ( Form form = CreateMyForm() ) {
  form.TopMost = false;
  form.ShowDialog(parent);
  ...
}

答案 2 :(得分:0)

我没有找到一种方法来阻止表单在显示ShowDialog()时显示最顶层(这会将表单显示为模式,我不知道如何覆盖它)。

但是,通过在this StackOverflow question中观看Show()事件,我找到了一种方法,可以通过form.Disposed显示第二种表单。

来自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一样),因此事件会在表单关闭的每个时间触发这对我的情况没问题。

答案 3 :(得分:0)

paywindow.ShowDialog(this)

应该有效。附加参数说明父项是如何进行的,并使其在父项之上,而不是最上层。最重要的是即使您激活另一个窗口,窗口也会粘在桌面上。这不是ShowDialog的默认行为。正如JaredPar所提到的,将表单/窗口设置为TopMost = false为真。

答案 4 :(得分:-1)

paywindow.ShowDialog(this)