有没有办法可以将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()并观察不同类型的返回?)

感谢您的帮助!

有帮助吗?

解决方案

使用这样的东西: 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中获取它;)

其他提示

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

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

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

但是,通过在 form.Disposed 事件,我找到了一种观察第二种形式的方法,当用 Show()显示时“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 ),因此事件会每隔时间触发表格关闭,这对我的情况没问题。

paywindow.ShowDialog(this)

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

paywindow.ShowDialog(this)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top