我可以将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中重新加载信息。
用户可以填入窗口的信息来自其他来源,例如网络浏览器,因此将表单放在所有应用程序之上是不理想的。
有没有办法可以阻止窗口在所有应用程序之上(我的系列窗口中最顶层的很好),或者有办法告诉用户点击另一个窗体的按钮(基本上,使用 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()
显示时最顶层(这显示表单作为模态,我不知道如何覆盖它)。
来自 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)