有没有办法可以将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()
并观察不同类型的回报)?
感谢您的帮助!
答案 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)