2009-03-05 76 views
2

在C#winforms应用程序中在通过另一个窗体打开的表单上持久化数据的常规方法是什么?我曾计划将它全部保留在表单对象上,但是当表单关闭时,似乎表单对象被处理掉了。这意味着我放弃了所有的数据。在Win窗体应用程序中持久化表单数据

我可以将表单包装到另一个将所有数据关闭的对象中,但这似乎很多工作。

有没有办法隐藏表单时,它被关闭,而不是处置它?

回答

2

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

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

2种可能性:

1)抓住关闭事件,只是隐藏它。创建函数(隐藏表单)以使用属性获取输入值。

private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e) 
{ 
    this.Visible = false; 
    e.Cancel = true; 
} 

2)什么司法部告诉:如果您关闭该窗体创建后,表单对象仍然活着,并且可以访问

我赞成2)+属性

+0

如此捕捉关闭事件并隐藏它将覆盖正常行为并阻止其被丢弃? – 2009-03-05 12:17:46

+0

是你关闭它,它不会被丢弃,只有当它超出范围 – RvdK 2009-03-05 12:21:10

2

使用公共属性。

  • 关闭之前,填充这些属性具有相应的值(即。this._userName = txtUsername.Text)
  • 关闭窗体
  • 在窗体的父对象,仍可以调用对话框。用户名来读取值。
0

访问子窗体的控件它在技术上是可行的,但不是一个好的设计。 以下是我的工作方式:

1)接受/保存按钮,您将this.DialogResult设置为“OK”,并获取所有控件信息。在关闭按钮或/和关闭事件集this.DialogResult到“取消”

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

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

4)在你的父表单上检查是否dialog.ShowDialog()== DialogResult.OK然后访问你在步骤2中创建的公共属性......或者如果你用信息加载一个对象只是访问该对象在表格中(由一个属性也)

5)那么调用dialog.Dispose()方法...或者用户按下确定或取消。

希望这可以帮助你...

1

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

如果你不知道这个文件尚未: How to: Create a Simple-Bound Control on a Windows Form

马蒂亚斯

1

可以隐藏形式与处置它,但是这是几乎可以肯定不是你想要的。如果只是隐藏表单,表单会占用不会被释放的过程中的资源。如果你处理它们,它们只会消失。当一堆Form实例不被使用时,只是在后面问一个问题。

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

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