4

我一直在处理奇怪的问题。我在一个项目中使用 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。我已经尝试DialogResult = DialogResult.NoneForm2进行设置,但无济于事。请帮我。

我一直在使用这种技术,而这件事从未发生过。

4

3 回答 3

7

是的,这段代码很麻烦。当用户关闭对话框时出错。然后 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...
            }
        }
    }
于 2010-12-05T13:37:55.887 回答
0

烦了我好几天!!发现这个:https ://bytes.com/topic/net/answers/769433-c-showdialog-inside-showdialog-closing-both-return

结果被传下来了,我不知道为什么。但是,如果在 .ShowDialog() 我刚刚放了之后this.DialogResult = DialogResult.None,它会修复它。这首先不应该发生,但这可以解决它,所以我不会太在意。


您还可以尝试将按钮本身上的 dialogResult 更改为“无”或this.Btn1.DialogResult...从对某些人有用的设计器中删除。

https://social.msdn.microsoft.com/Forums/vstudio/en-US/543093ad-1860-4428-bae1-b0d4f112e04b/showdialog-closes-parent?forum=csharpgeneral

于 2018-06-21T16:53:10.673 回答
-1

我知道这是一篇旧帖子,但我遇到了这个问题,就我而言,接受的答案(在我写这篇文章时)根本没有帮助。@blind Skwirl 的回答让我找到了罪魁祸首。

经过 20 年的 .Net 编程(自引入以来),我从未注意到 BUTTONS 具有“dialogresult”属性。我总是只设置表单“取消按钮”和“接受按钮”属性。我在我的案例中发现的是(因为我做了很多按钮的复制粘贴),我有一堆按钮(不是表单),它们本身的“dialogresult”属性设置为“cancel”,这意味着我会单击对话框上的一个按钮,该按钮将打开另一个对话框,对话框上的“确定”按钮的结果设置为“取消”,父表单上的按钮也将其结果设置为“取消”,所以对话框将关闭(由于取消),然后父表单将因取消而关闭,这让我很困惑.. . 所以...

只需确保所有按钮的 dialogresult 属性设置为 NONE(或您想要的任何实际正确设置)。

最重要的是,如果 BUTTON(不是表单)的 dialogresult 属性设置为 NONE 以外的任何值,则表单将在单击时以该结果关闭(在任何单击事件代码完成后)。

我希望这可以帮助那里的人。

于 2020-10-31T16:37:29.620 回答