Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用ShowDialog时,最好有一个新窗体实例,还是每次显示窗体时都创建新窗体?-C#_C#_Winforms - Fatal编程技术网

使用ShowDialog时,最好有一个新窗体实例,还是每次显示窗体时都创建新窗体?-C#

使用ShowDialog时,最好有一个新窗体实例,还是每次显示窗体时都创建新窗体?-C#,c#,winforms,C#,Winforms,我用c#编写了一个简单的winform应用程序。它在数据网格视图控件上显示数据,当用户双击该行时,将显示另一个(非MDI)表单,显示新表单上的相关日期 新表单有一个数据表类型变量和一个只读数据网格视图,每次用户单击网格行(在父窗口上)时,我都将新的数据源分配给网格 在类级别创建表单的新实例并使用show对话框显示表单更好吗?还是应该在用户每次双击该行时使用using语句 方法1 MyForm _form = new MyForm(); void button1_OnClick(object s

我用c#编写了一个简单的winform应用程序。它在数据网格视图控件上显示数据,当用户双击该行时,将显示另一个(非MDI)表单,显示新表单上的相关日期

新表单有一个数据表类型变量和一个只读数据网格视图,每次用户单击网格行(在父窗口上)时,我都将新的数据源分配给网格

在类级别创建表单的新实例并使用show对话框显示表单更好吗?还是应该在用户每次双击该行时使用using语句

方法1

MyForm _form = new MyForm();

void button1_OnClick(object sender, EventArgs e) {
    _form.ShowDialog(this);
}
方法2

void button1_OnClick(object sender, EventArgs e) {
      using (MyForm _form = new MyForm())
      {
        _form.ShowDialog(this);
       }

}

这取决于你真正想要什么

例如: 您需要为您的应用程序创建聊天表单。 运行表单从数据库加载一个大的历史记录。 在这种情况下,最好的决定是不要更新表单。

方法2带有“using”关键字,更干净、更安全

将表单保留在内存中可能会导致难以调试的奇怪行为。例如,如果表单有一个计时器,它每5秒显示一个messagebox(作为一个简单的测试),那么即使在您“关闭”表单之后,如果您在使用后不处理它,messagebox也会继续弹出,这就是“使用”将为您清理的内容。即使您打算保留以前的属性,最好只保留属性而不是表单本身,并在每次实例化表单时将属性传递给表单。还有其他不太明显的事情(如引用对象中的值发生变化),您可能会花费数小时来跟踪。

在C#中,变量和变量的范围都应该尽可能严格。第二个示例允许您使用局部变量而不是字段,因此它“更好”,尽管您不应该使用下划线作为局部变量名

void button1_OnClick(object sender, EventArgs e)
{
    using (MyForm form = new MyForm())
    {
        form.ShowDialog(this);
    }
}
但是,如果您发现反复加载和卸载表单时出现性能问题,或者如果您需要在表单中保留状态,那么使用第一个示例完全可以。只需记住处理该字段

MyForm _form = new MyForm();

void button1_OnClick(object sender, EventArgs e)
{
    _form.ShowDialog(this);
}

public override void Dispose()
{
    _form.Dispose();
    base.Dispose();
}

这取决于是否要使用以前的属性。每次使用构造函数“NEW”创建表单时“您丢失了表单上以前的所有属性。因此,如果要保留旧值,则无法处理旧表单。请参阅我的双表单项目:谢谢。我正在使用show dialog,我认为它的工作方式不同。我可能错了。show()和ShowDialog()之间的区别在于show()方法您可以从表单返回而不进行处理,而ShowDialog()您必须关闭/处理表单才能返回。您可以从ShowDialog()更改为Show()。公平点。我认为传递填充的数据集(通用列表,无论什么)将其复制到新副本中是一个更好的选择,这样可以消除表单之间的数据同步问题。在第二个示例中,MyForm始终只有一个实例,那么在什么时候调用dispose方法?如果它是应用程序的主表单,则当应用程序结束时,它将由运行时处理。严格地说,这不是完全必要的,因为结束流程也会处理所有资源。但这是一种良好的做法,尤其是如果您以后可能会引入更多表单。