首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正确使用DialogResult

正确使用DialogResult
EN

Stack Overflow用户
提问于 2013-05-30 22:02:51
回答 2查看 86.8K关注 0票数 36

在对我最近的一个问题(这里)的回答中,汉斯·帕桑特说,我应该设置DialogResult来关闭我的表单,而不是form.Close(),尽管我似乎不知道为什么?

如果我读对了,MSDN文档指出,这样做只会隐藏表单,而不是正确地处理它,我相信.Close()会这样做?

文档中的提取

当用户单击对话框的“关闭”按钮或设置DialogResult属性值时,不会自动调用Close方法。相反,表单是隐藏的,可以在不创建对话框的新实例的情况下再次显示。由于这种行为,当应用程序不再需要窗体时,必须调用窗体的Dispose方法。

另一方面,微软已经创建了一个支持页,说明如何使用DialogResult属性,并且在该属性的“验证它工作”部分中,它声明单击so将关闭表单。

因此,我的问题是两个折叠,我应该继续使用关闭或DialogResult代替;对话框结果关闭或隐藏一个表单。从下面我编写的代码(一个带有两个按钮的简单表单)来看,它似乎只在this.Close()上的一个断点被击中时才被隐藏。( this.Close()注释了,表单仍然消失,只是不确定是否隐藏)

代码语言:javascript
复制
    public Form1()
    {
        InitializeComponent();
        button1.Click += (s, e) =>
            {
                 //I edited my question to include using
                using(Form1 form = new Form1())
                {
                    form.ShowDialog();
                }

            };
        button2.Click += (s, e) => 
            {
                this.DialogResult = DialogResult.OK;
                this.Close();
            };
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-30 22:14:02

使用ShowDialog打开模式对话框时,调用代码将被阻塞,直到被调用的窗体关闭或隐藏为止。如果您想要根据单击OK或Cancel按钮读取被调用表单的一些公共属性并执行一些操作(例如,将数据保存到数据库或文件),则需要知道用户是否希望执行该操作。由DialogResult ()方法返回的ShowDialog()方法允许您采取适当的操作。

所以,例如

代码语言:javascript
复制
using (Form1 form = new Form1())
{
    DialogResult dr = form.ShowDialog();
    if(dr == DialogResult.OK)
    {
        string custName = form.CustomerName;
        SaveToFile(custName);
    }
    
}

要添加到这个答案中的一件重要的事情是,DialogResult属性同时存在于Form类和Button类中。将按钮的DialogResult属性(通过代码或设计器)设置为与DialogResult.None不同的值是激活窗体重要行为的关键。如果单击具有该属性集的按钮,则窗体引擎将按钮属性的值传递给窗体属性,并触发窗体的自动关闭,以重新激活调用方代码。如果按钮单击有一个事件处理程序,则可以运行代码来验证表单的输入,并强制窗体保持打开,重写窗体的DialogResult属性,将其设置为DialogResult.None

例如,在模式显示的表单中,您可以拥有:

代码语言:javascript
复制
// Event handler for the OK button set with DialogResult.OK
public void cmdOK_Click(object sender, EventArgs e)
{
     // Your code that checks the form data and
     // eventually display an error message.
     bool isFormDataValid = ValidateFormData();

     // If data is not valid force the form to stay open
     if(!isFormDataValid)
        this.DialogResult = DialogResult.None;
}
票数 29
EN

Stack Overflow用户

发布于 2013-05-30 22:05:35

是否调用Close或设置DialogResult属性并不是真正的问题。您只需要确保打电话给Dispose。我更喜欢用一个使用块来完成这个任务:

代码语言:javascript
复制
using (Form1 form = new Form1())
{
    form.ShowDialog();
}

我最初以为您可以在已经调用了ShowDialog方法的Form上调用Close。事实并非如此。如果您用ShowDialog模型显示表单,那么它是由于Close方法而关闭还是设置DialogResult属性似乎并不重要。设置DialogResult似乎只是关闭Form的捷径。

但是,无论是调用Close还是设置DialogResult属性,关键都是要确保调用Dispose()或将表单放在using块中。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16846573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档