如何关闭表单

21

好的,有一个Windows Forms类WindowSettings和一个带有“取消”按钮的窗体。 当用户单击该按钮时,对话框DialogSettingsCancel将弹出并询问用户是否确定执行该操作。 对话框有两个按钮:“是”和“否”。 如果用户单击“Yes”按钮,则我希望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();
}
当我运行我的应用程序,进入设置表单,点击“取消”按钮,然后再点击“是”按钮时,只有DialogSettingsCancel关闭而没有关闭WindowSettings。
为什么它不能工作?
我也尝试了更改。
this.Close();
settings.Close();

settings.Close();
this.Close();

但最终结果仍然相同。


1
您的“设置”从未显示为关闭,您可能正在寻找其他实例。 - Sten Petrov
这是因为在关闭其他“Window”之前,您正在关闭处理单击事件的“Window”。这不是一个Form类,而是一个“Window”类,差别很大。此外,settings不等于WindowSettings实例,而是等于完全不同的实例。请使用VS调试器。 - Security Hound
8个回答

16

你需要的是打开的实际 WindowSettings 实例,而不是新创建一个。

目前,你正在创建一个新的 WindowSettings 实例并对其调用 Close。这没有任何作用,因为这个新实例从未被显示过。

相反,当显示 DialogSettingsCancel 时,将当前实例的 WindowSettings 设置为其父对象。

像这样:

WindowSettings 中:

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

DialogSettingsCancel中:

public WindowSettings OwningWindowSettings { get; set; }

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

这种方法考虑到一个 DialogSettingsCancel 可能会在没有父级 WindowsSettings 的情况下打开。

如果两者始终连接在一起,您应该改用构造函数参数:

WindowSettings 中:

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

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();
}

8

您也可以关闭应用程序:

Application.Exit();

它将终止进程。

6
new WindowSettings();

你刚刚关闭了一个全新的窗体实例,但它一开始并没有显示。

你需要通过将其作为构造函数参数接受并将其存储在字段中来关闭原始窗体实例。


3
为什么不使用 DialogResult 方法来关闭窗体?
if(DialogSettingsCancel.ShowDialog() == DialogResult.Yes)
{
     //this will close the form but will keep application open if your 
     //application type is "console" in the properties of the project
     this.Close();
}

然而,要使其正常工作,您需要在调用DialogSettingsCancel窗体时,在“WindowSettings”表单内进行操作。这与您调用OpenFileDialog或任何其他对话框窗体的方式非常相似。


2

在创建设置窗口后,您立即关闭了它。您需要先显示设置窗口,然后等待对话框结果。如果返回的结果是取消,则关闭该窗口。例如:

private void button1_Click(object sender, EventArgs e)
{
    Settings newSettingsWindow = new Settings();

    if (newSettingsWindow.ShowDialog() == DialogResult.Cancel)
    {
        newSettingsWindow.Close();
    }
}

1

打开或关闭winform有不同的方法。 Form.Close()是关闭winform的一种方法。

当执行'Form.Close()'时,该窗体中创建的所有资源都将被销毁。 资源包括控件及其子控件(标签、按钮)、窗体等。

还有其他关闭winform的方法。

  1. Form.Hide()
  2. Application.Exit()

打开/启动表单的一些方法

  1. Form.Show()
  2. Form.ShowDialog()
  3. Form.TopMost()

它们都有不同的表现,去探索它们吧!


0
WindowSettings作为DialogSettingsCancel构造函数的参数发送,然后在button1_Click中,当按下“是”时,调用两者的close方法。
public class DialogSettingsCancel
{
    WindowSettings parent;

    public DialogSettingsCancel(WindowSettings settings)
    {
        this.parent = settings;        
    }

    private void button1_Click(object sender, EventArgs e)
    {
        //Code to trigger when the "Yes"-button is pressed.
        this.parent.Close();
        this.Close();
    }
}

0
例如,如果您想在执行操作时关闭Windows窗体,则有两种方法可以实现

1.直接关闭它

Form1 f=new Form1();
f.close(); //u can use below comment also
//this.close();

2. 我们也可以隐藏表单而不关闭它

 private void button1_Click(object sender, EventArgs e)
    {
        Form1 f1 = new Form1();
        Form2 f2 = new Form2();
        int flag = 0;
        string u, p;
        u = textBox1.Text;
        p = textBox2.Text;
        if(u=="username" && p=="pasword")
        {
            flag = 1;
        }
        else
        {
          MessageBox.Show("enter correct details");
        }
        if(flag==1)
        {
            f2.Show();
            this.Hide();
        }

    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接