19

好的,所以一个 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();
}

当我运行我的应用程序并转到设置表单并单击“取消”按钮,然后单击“是”按钮时,只有 DialogSettingsCancel 关闭而不关闭 WindowSettings。

为什么它不起作用?

我也试过改变

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

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

但还是一样的结果。

4

8 回答 8

14

您需要打开的实际实例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();
}

这种方法考虑到 aDialogSettingsCancel可能在没有 aWindowsSettings作为父级的情况下打开。

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

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();
}
于 2013-01-17T14:54:33.800 回答
6
new WindowSettings();

您刚刚关闭了一个最初不可见的表单的全新实例。

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

于 2013-01-17T14:53:19.117 回答
5

您也可以关闭应用程序:

Application.Exit();

它将结束进程。

于 2015-08-25T19:02:08.230 回答
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 或任何其他 Dialog 表单的方式非常相似。

于 2013-01-17T15:02:55.083 回答
2

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

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

    if (newSettingsWindow.ShowDialog() == DialogResult.Cancel)
    {
        newSettingsWindow.Close();
    }
}
于 2013-01-17T14:58:34.070 回答
0

WindowSettings作为DialogSettingsCancel的构造函数的参数发送,然后在按下 yes 时在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();
    }
}
于 2013-01-17T15:01:37.620 回答
0

例如,如果您想在执行操作时关闭窗口窗体,有两种方法可以做到这一点

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

    }
于 2018-03-13T15:36:41.813 回答
0

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

当 'Form.Close()' 执行时,以该表单创建的所有资源都将被销毁。资源意味着控件及其所有子控件(标签、按钮)、表单等。

其他一些关闭winform的方法

  1. Form.Hide()
  2. 应用程序.Exit()

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

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

他们都有不同的行为,探索他们!

于 2018-10-29T05:19:25.393 回答