【问题标题】:How to serialize controls如何序列化控件
【发布时间】:2012-04-24 08:56:53
【问题描述】:

我们有一个包含 xml 文件的数据库的应用程序。它具有客户端服务器架构。所以这里服务器将使用数据集从 xml 文件中读取数据并将其存储在 xml 模式中。然后服务器将数据序列化并将其传递给 UI(客户端)。因此 UI 数据使用左侧的 Treeview 显示,右上方的 listview 和右下方的 propertygrid 显示。

Ui 中的数据分为类和对象。所以现在我们的数据库中有一个 xml 文件 machineclass.xml 和 machineobjects.xml。 machineclass.xml 包含各种类,如电子类、计算机类、农业工具类等,而 machineobjects.xml 包含电视、pentium4 计算机、拖拉机等。所以现在在 UI 中,如果我从树视图中选择电子节点,它将列出电视、收音机、电话等通过使用 Listview,它在右上角包含的任何对象,如果我选择对象“TV”,则电视的相关属性显示在右下角的 propertygrid 中。

所以现在我们有一个任务,如果有人想从父 machineclass.xml 和 machineobjects.xml 中以 xml 文件(.xml)的形式从 UI 中取回选定的对象

例如,如果有人从 UI 列表视图中选择了 TV,并希望以 .xml 文件(tv.xml)的形式进行备份,以便在一段时间后可以导入数据,我们可以在这里实现什么逻辑?我可以序列化 listview 和 propertygrid,还是有任何选项可以做到这一点? 这是我在 UI 中用于复制粘贴操作的一些代码

【问题讨论】:

  • 但是在对 UI 中的所有对象进行反序列化后,我该如何做到这一点,如果选择了对象,如何进行序列化?
  • 查看我的答案,而不是填充控件,例如 listview.Add(item) - 你应该有一个业务对象,例如一个 List 然后在你的 GUI 中唯一的代码是 listview.DataSource =业务对象.ListOfItems。在 businessObject 中,您将有一个名为 saveSerializedListOfItems() 的方法

标签: c# visual-studio-2010 listview treeview propertygrid


【解决方案1】:

我可以序列化 listview 和 propertygrid,还是有任何选项可以 这样做?

以下是如何序列化 ListView:
http://www.codeproject.com/Articles/3335/Persist-ListView-settings-with-serialization

以下是如何序列化 PropertyGrid:
http://www.codeproject.com/Articles/27326/Load-and-Save-Data-Using-PropertyGrid

我的建议是正确执行,我认为正确的解决方案是序列化 ListView 和 PropertyGrid 也绑定的业务对象。将业务逻辑从 GUI 中分离出来,真的很简单

编辑(在 OP 编辑​​问题后显示代码):

将数据保存到 XML 文件:

System.Runtime.Serialization.Formatters.Binary.BinaryFormatter BinFormatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
System.IO.FileStream FS = new System.IO.FileStream("C:\\tv.xml", IO.FileMode.Create);
BinFormatter.Serialize(FS, new ArrayList(listview1.Items));
FS.Close();

从 XML 文件中读取数据:

System.Runtime.Serialization.Formatters.Binary.BinaryFormatter BinFormatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
string fname;
System.IO.FileStream FS = new System.IO.FileStream("C:\\tv.xml", IO.FileMode.Open);
listview1.Items.AddRange(BinFormatter.Deserialize(FS).ToArray(typeof(ListViewItem)));
FS.Close();

以下是使用 PropertyGrid 的方法: PropertyGrid.Serialize

【讨论】:

  • 我添加了一些现有代码,在我的 UI 中进行复制粘贴操作
  • 嗯,我可能需要更多时间来向您更新此状态,但在此之前您可以再次查看我的问题,我已经修改了它
  • @michale 刷新此页面,我在您上次发表评论之前更新了我的答案。我可以看到您拥有的代码,只需将 2 个方法添加到 TrevoListView。一个用于保存项目,另一个用于读取项目。一旦您完成了对 PropertyGrid 的操作 - 无论是在相同的两个函数中还是在两个新函数中都取决于您。
  • 您可以将 XML 文件保存到 Application.StupPath 或 Users\Documents 文件夹中。最好给用户一个保存/打开对话框,这样他们就可以选择他们希望保存文件的位置
  • 现在我真的怀疑,序列化是生成 xml 文件的最佳方式还是需要使用任何其他方法。因为任何子集 .xml 是使用 Savefiledialog 保存的,所以一旦保存它应该加载到新的树视图中,序列化的 xml 可以加载到树视图中??
猜你喜欢
  • 2011-01-14
  • 1970-01-01
  • 1970-01-01
  • 2011-05-03
  • 1970-01-01
  • 2012-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多