我一直在处理奇怪的问题。我在一个项目中使用KryptonForm。我有一个表单(比如form1),我需要在这个表单的按钮上打开另一个表单。这是代码:
void btn_click(object sender, EventArgs e)
{
Visible = false;
ShowInTaskbar = false;
var f = new Form2();
f.ShowDialog();
Visible = true;
ShowInTaskbar = true;
}
问题是,当 Form2 关闭时,它也会关闭 Form1 。我尝试从 Form2 设置DialogResult = DialogResult.None
,但无济于事。请帮帮我。
我一直在使用这种技术,这件事从未发生过。
答案 0 :(得分:6)
是的,这段代码很麻烦。用户关闭对话框时出错。然后Windows必须找到另一个窗口来关注焦点。您的应用中没有任何剩余,您的主窗口是不可见的。然后它选择另一个应用程序的窗口。例如,这将是一个很好的例子,这将是Visual Studio中的一个窗口。一个大的。你的主要形式现在消失了。
在对话框关闭之前,您需要确保主窗口再次可见。您可以通过订阅对话框的FormClosing事件处理程序来完成此操作。例如:
private void button1_Click(object sender, EventArgs e) {
using (var dlg = new Form2()) {
dlg.StartPosition = FormStartPosition.Manual;
dlg.Location = this.Location;
dlg.FormClosing += (s, ea) => this.Show(); // <=== Here
this.Hide();
if (dlg.ShowDialog() == DialogResult.OK) {
// etc...
}
}
}
答案 1 :(得分:0)
您是否考虑过例外?如果Form2
抛出异常,则不会执行您的上一个语句Visible = true
和ShowInTaskbar = true
。当你尝试这个时会发生什么:
ShowInTaskbar = Visible = false;
try
{
using (var f = new Form2()) // (added since Form2 is an IDisposable)
{
f.ShowDialog();
}
}
finally // make sure that the following gets executed even when
{ // exceptions are thrown during f.ShowDialog():
ShowInTaskbar = Visible = true;
}
在此方法中打开另一种形式而不是Form2
时会发生什么?
如果问题消失,问题可能不在此方法中,而是Form2
。
如果问题仍然存在:您是否确定在此方法中执行的操作与使用相同技术的其他方法完全相同?
答案 2 :(得分:0)
给我包了好几天!找到了这个:https://bytes.com/topic/net/answers/769433-c-showdialog-inside-showdialog-closing-both-return
结果被传递了下来,我不知道为什么。但是,如果在.ShowDialog()之后仅放this.DialogResult = DialogResult.None
,它将对其进行修复。首先不应该发生这种情况,但是可以解决此问题,因此我不必太担心。
您还可以尝试将按钮本身的dialogResult更改为“ None”,或从对某些人有用的设计器中删除this.Btn1.DialogResult...
。
答案 3 :(得分:-1)
我知道这是一篇过时的文章,但是我遇到了这个问题,就我而言,接受的答案(在撰写本文时)根本没有帮助。 @blind Skwirl的回答将我带到了罪魁祸首。
经过20年的.Net编程(自引入以来),我从未注意到BUTTONS具有“ dialogresult”属性。我总是只设置表单“ cancelbutton”和“ acceptbutton”属性。在我的案例中发现的是(因为我做了很多按钮的复制粘贴操作),所以我有一堆按钮(不是表单)本身的“ dialogresult”属性设置为“ cancel”,这意味着我将单击一个对话框上的一个按钮,该对话框将打开另一个对话框,该对话框上的“确定”按钮的结果设置为“取消”,父窗体上的按钮也将其结果设置为“取消” ,因此对话框将关闭(结果为cancel),然后PARENT表单将结果为cancel 关闭,这让我很困惑……所以...
只需确保所有按钮的dialogresult属性设置为NONE(或您想要的任何实际适当设置)。
最下面的一行,如果按钮(不是窗体)的dialogresult属性设置为NONE以外的任何其他值,则在单击该窗体时(在所有点击事件代码完成之后),窗体将关闭并显示该结果。 / strong>
我希望能对那里的人有所帮助。