【问题标题】:C# Windows Forms - Preserving data in dynamically created objects [closed]C# Windows 窗体 - 在动态创建的对象中保存数据 [关闭]
【发布时间】:2016-08-23 13:45:57
【问题描述】:

我目前正在使用 C# 开发一个 Windows 窗体应用程序,并且想知道如何在执行之间保存数据?我的应用程序从一个空白表单开始,该表单具有一个动态创建用户控件的按钮,每个控件只包含一个文本框(图片是一个待办事项列表)。用户可以在这些文本框中写入内容,也可以动态删除它们。

我已经构建了应用程序,并且可以创建多个对象,但我想知道如何在关闭和重新打开它之间保存数据。这是在 VS 2015 中。

非常感谢!

【问题讨论】:

  • 您必须在启动时加载数据(您有模型或数据类吗?),当用户更改任何内容时更新并保存数据。存储机制可以是任何东西,数据库、文件……
  • @hankide 你假设有任何东西要序列化。无法序列化用户控件或文本框。
  • 称为数据库。最简化的版本只是一个文本文件。
  • 由于您似乎只需要将文本存储在 TextBoxes 中,因此问题相当简单,不是吗?将文本序列化为 List 并在启动时再次反序列化它。然后为列表中的每个字符串创建一个 UC!总共 20-30 行代码..

标签: c# preserve


【解决方案1】:

基本上,您有两个选择。

  1. 存储到文件。
  2. 存储到数据库。

根据您的情况、权限等,您可能希望调用 Web 服务并将状态信息提供给它。然后,在重新启动时,您只需从中读取。

或者,如果这是一个不错的选择,您可以简单地将信息存储在本地文件中,然后从中读取。不过,数据的可交换性会受到影响,而且您可能会面临访问权限问题。

如果您需要存储的信息量相当有限,您可能只需将几个键写入注册表即可。信息仍将是本地的,并且需要授予访问权限,但除此之外,您会很好地划分数据。

【讨论】:

    【解决方案2】:

    在这种情况下,我建议制作一个文本框列表,然后序列化它们的值,然后保存为某种格式,比如 xml。可以序列化整个列表,然后用简单的代码加载它。

    编辑:Maarten 有一个很好的观点,我忘记了你不能序列化整个组件。我假设您正在动态添加文本框,因此您已经有了一些值列表/数组。

    【讨论】:

    • 如果您制作文本框中的值列表,而不是文本框列表,这将起作用。
    • 你从哪里得到这个@Maarten?你甚至可以序列化你自己的类
    • 因为System.Windows.Forms.ControlSystem.Windows.Forms.TextBox 既没有实现ISerializable 也没有标记[Serializable] 属性。另见this question。您不能序列化 WinForms UI 对象。
    • @Maarten 你是对的,我完全忘记了,编辑答案
    • 废话,您设置的任何属性都可以以一种或另一种方式序列化。所以除了写出序列化/反序列化代码之外真的没有其他问题。通常的方法是创建可序列化的影子类。不过,您必须知道您确实需要哪些属性。请记住,它们是在代码中设置的,因此您可以保存它们!序列化枚举值将避免任何幻数..
    猜你喜欢
    • 2013-11-04
    • 2013-11-10
    • 1970-01-01
    • 2022-12-11
    • 2013-10-31
    • 2013-01-12
    • 1970-01-01
    • 2019-12-24
    • 2014-06-27
    相关资源
    最近更新 更多