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

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

但是,我找到了一种方法来观察第二种形式,当用 显示时Show(),通过观察这个 StackOverflow 问题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; 
}

据我所知,这不允许我查看表单关闭的原因(例如 with DialogResult),因此每次表单关闭时都会触发事件,这对我的情况来说是可以的。

于 2009-05-03T19:53:10.553 回答
0
paywindow.ShowDialog(this)

应该管用。附加参数告诉父级如何,并将使其位于父级之上,但不是最顶层。Topmost 意味着即使您激活另一个窗口,该窗口也会停留在您的桌面上。这不是 ShowDialog 的默认行为。正如 JaredPar 提到的,将您的表单/窗口设置为 TopMost=false 为真。

于 2010-05-07T21:00:51.643 回答
-1
paywindow.ShowDialog(this)
于 2009-05-03T12:54:06.537 回答