如何在C#中关闭表单

osv*_*ein 12 c# button winforms formclosing

好吧,所以Windows窗体类,WindowSettings和窗体都有一个"取消"按钮.当用户单击该按钮时,将弹出对话框DialogSettingsCancel并询问用户他是否确定要执行该操作.该对话框有2个按钮,"是"按钮和"否"按钮.如果用户单击"是"按钮,我想要关闭DialogSettingsCancel和WindowSettings.

我在DialogSettingsCancel中的button_Click事件处理程序:

private void button1_Click(object sender, EventArgs e)
{
    //Code to trigger when the "Yes"-button is pressed.
    WindowSettings settings = new WindowSettings();
    this.Close();
    settings.Close();
}
Run Code Online (Sandbox Code Playgroud)

当我运行我的应用程序,并转到设置窗体,然后单击"取消"按钮,然后单击"是" - 按钮,只关闭DialogSettingsCancel而不关闭WindowSettings.

为什么它不起作用?

我也试过改变

this.Close();
settings.Close();
Run Code Online (Sandbox Code Playgroud)

settings.Close();
this.Close();
Run Code Online (Sandbox Code Playgroud)

但结果仍然相同.

Dan*_*rth 11

您需要打开的实际实例WindowSettings,而不是新实例.

目前,您正在创建一个新实例WindowSettings并调用Close它.这没有做任何事情,因为新的实例从未显示过.

相反,当显示时DialogSettingsCancel将当前实例设置WindowSettings为父实例.

像这样的东西:

WindowSettings:

private void showDialogSettings_Click(object sender, EventArgs e)
{
    var dialogSettingsCancel = new DialogSettingsCancel();
    dialogSettingsCancel.OwningWindowSettings = this;
    dialogSettingsCancel.Show();
}
Run Code Online (Sandbox Code Playgroud)

DialogSettingsCancel:

public WindowSettings OwningWindowSettings { get; set; }

private void button1_Click(object sender, EventArgs e)
{
    this.Close();
    if(OwningWindowSettings != null)
        OwningWindowSettings.Close();
}
Run Code Online (Sandbox Code Playgroud)

这种方法考虑到,DialogSettingsCancel可能在没有WindowsSettings父母的情况下打开.

如果两者始终连接,则应使用构造函数参数:

WindowSettings:

private void showDialogSettings_Click(object sender, EventArgs e)
{
    var dialogSettingsCancel = new DialogSettingsCancel(this);
    dialogSettingsCancel.Show();
}
Run Code Online (Sandbox Code Playgroud)

DialogSettingsCancel:

WindowSettings _owningWindowSettings;

public DialogSettingsCancel(WindowSettings owningWindowSettings)
{
    if(owningWindowSettings == null)
        throw new ArgumentNullException("owningWindowSettings");

    _owningWindowSettings = owningWindowSettings;
}

private void button1_Click(object sender, EventArgs e)
{
    this.Close();
    _owningWindowSettings.Close();
}
Run Code Online (Sandbox Code Playgroud)


小智 9

您还可以关闭该应用程序:

Application.Exit();
Run Code Online (Sandbox Code Playgroud)

它将结束进程。


SLa*_*aks 6

new WindowSettings();
Run Code Online (Sandbox Code Playgroud)

您刚刚关闭了一个首先看不到的表单的全新实例.

您需要通过将其作为构造函数参数接受并将其存储在字段中来关闭表单的原始实例.