C# 在Win forms应用程序中持久化表单数据

C# 在Win forms应用程序中持久化表单数据,c#,winforms,C#,Winforms,在C#winforms应用程序中,在另一个窗体打开的窗体上保存数据的正常方式是什么?我本来打算把它全部保存在表单对象上,但是当表单关闭时,似乎表单对象被释放了。意思是我丢失了所有的数据 我可以将表单包装在另一个对象中,这样可以去除表单中的所有数据,但这似乎需要做很多工作 是否有一种方法可以在窗体关闭时隐藏它,而不是将其丢弃?2可能性: 1) 捕捉关闭事件并将其隐藏。创建函数(到隐藏表单)以使用属性获取输入值 private void Form1_Closing(object sender, Sy

在C#winforms应用程序中,在另一个窗体打开的窗体上保存数据的正常方式是什么?我本来打算把它全部保存在表单对象上,但是当表单关闭时,似乎表单对象被释放了。意思是我丢失了所有的数据

我可以将表单包装在另一个对象中,这样可以去除表单中的所有数据,但这似乎需要做很多工作

是否有一种方法可以在窗体关闭时隐藏它,而不是将其丢弃?

2可能性:

1) 捕捉关闭事件并将其隐藏。创建函数(到隐藏表单)以使用属性获取输入值

private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
    this.Visible = false;
    e.Cancel = true;
}
2) Moj告诉我们的是:如果在创建表单后关闭表单,表单对象仍然是活动的,可以访问


我赞成2)+属性使用公共属性

  • 关闭前,用相应的值填充这些属性(即this.\u userName=txtUsername.Text)
  • 关闭窗体
  • 在表单的父对象中,仍然可以调用dialog.Username来读取值

关闭时,不处理表单。 通常,这就是数据的管理方式

  Result res;
  using (MyForm form = new MyForm())
  {
      if(form.ShowDialog()== DialogResult.OK) 
      {
         // In Myform, after the data collection is done, you can set  DialogResult=DialogResult.Ok and close form using form.Close(); 
         res = form.Result; // expose forms data as result.                              
      }
  }
  UserResult(res);

访问子窗体的控件在技术上是可行的,但不是一个好的设计。 我是这样做的:

1) 在“接受/保存”按钮上,将
this.DialogResult
设置为“确定”,并获取所有控件信息。在关闭按钮或/和关闭事件上,将此对话框结果设置为“取消”

2) 如果数据映射到一个对象(比如说“客户”)。。。设置对象属性。如果没有,只需使用属性公开每个控件的数据,处理所有需要的格式化

3) 使用
this.Close()关闭表单不处理它

4) 在父窗体上,检查dialog.ShowDialog()==DialogResult.OK,然后访问在步骤2中创建的公共属性。。。或者,如果您加载了一个带有信息的对象,只需在表单中访问该对象(也可以通过属性访问)

5) 然后调用
对话框.Dispose()
方法。。。用户按了“确定”或“取消”


希望这对您有所帮助…

我建议您构建一个包含数据的单独对象。您可以用一种非常简单的方式将表单控件绑定到其属性(支持设计器,无需代码)。这样可以将数据与表单分开

如果您还不知道此文档:


Matthias

你可以隐藏表单,而不是处理表单,但这几乎肯定不是你想要的。表单占用流程中的资源,如果您只是隐藏表单,这些资源将不会被释放。只有你把它处理掉,它们才会消失。在不使用表单实例时保留一堆表单实例只是在以后的过程中提出一个问题

您可能想做的是在表单完成显示后但实际关闭之前从表单传回一些结果数据。比如说,

MyDataObject data;
using (var form = new SomeForm() ) {
  var dialogResult = form.ShowDialog(someWindow);
  data = form.InterestingData;
}

因此,捕获关闭事件并隐藏它将覆盖正常行为并阻止其被处置?如果您关闭它,它将不会被处置,仅当它超出范围时。但是,我不相信您可以在它被关闭后重新显示它。我认为您需要隐藏它Close()调用是不必要的,因为ShowDialog()在对话框关闭时返回。我删除了你帖子中的那一行,但在编辑别人的帖子时感觉很肮脏,并撤销了我的更改。请随意重新撤销它;)