如何关闭表格

Posted

技术标签:

【中文标题】如何关闭表格【英文标题】:How to close form 【发布时间】:2013-01-01 03:31:43 【问题描述】:

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

但结果还是一样。

【问题讨论】:

你的“设置”从一开始就没有显示为关闭,你可能正在寻找其他实例 发生这种情况是因为您在关闭另一个Window 之前关闭了处理点击事件的Window。这不是 Form 类,这是 Window 类的巨大差异。此外,设置不等于 WindowSettings 的实例,它等于一些完全不同的实例。使用 VS 调试器。 【参考方案1】:
new WindowSettings();

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

private void button1_Click(object sender, EventArgs e)

    Settings newSettingsWindow = new Settings();

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

【讨论】:

【参考方案4】:

发送 WindowSettings 作为 DialogSettingsCancel 的构造函数的参数,然后在 button1_Click 上按下 yes 时调用 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();
    

【讨论】:

【参考方案5】:

为什么不使用 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 表单的方式非常相似。

【讨论】:

【参考方案6】:

您也可以关闭应用程序:

Application.Exit();

它将结束进程。

【讨论】:

【参考方案7】:

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

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

    

【讨论】:

【参考方案8】:

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

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

其他一些关闭winform的方法

    Form.Hide() Application.Exit()

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

    Form.Show() Form.ShowDialog() Form.TopMost()

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

【讨论】:

以上是关于如何关闭表格的主要内容,如果未能解决你的问题,请参考以下文章

如何关闭 UIPopoverController 并选择表格单元格?

如何在多个页面上拉伸表格[关闭]

如何以编程方式关闭展开的表格视图单元格?

打开后如何关闭MdiChild表格?

如何在表格视图上方插入文本[关闭]

如何在快速向上和向下滚动表格时停止自动重新加载表格视图? [关闭]