繁体   English   中英

将WinForm或控件保存到文件

[英]Save WinForm or Controls to File

我一直在开发一个应用程序,该应用程序允许用户通过将标签控件添加到面板(我用作容器)来制作用于打印目的的标签模板。 我已经达到了需要将模板保存到文件中的目的,以后可以将其加载到内存中进行打印。 由于表单不可序列化,因此有人对我如何将表单或容器(带有添加的标签控件)保存到文件中以供日后重用的建议吗?

谢谢。

我不会直接将表格序列化为文件。 听起来您需要创建一个类来保存用户工作的状态。 然后,您应该将该类与文件进行序列化。 有使用二进制或XML序列化的内置方法。

  1. 创建一个结构,该结构包含有关每个Label足够信息(且不再包含),您可以从中重构Label

  2. 编写一个方法,该方法采用List<MyStruct>并从结构中填充Panel

  3. 编写方法以序列化和反序列化此列表。

  4. 将整个内容封装在一个类中。

就个人而言,我会将其序列化为JSON。 当带回它时,可以使用遍历并通过反射设置属性的通用方法。 还要注意,我链接到的库将自动序列化传递给它的对象。

JSON格式

JSON.NET

[{ "Label": [{"Top": 102}, {"Left": 105}, {"Text": "blah, blah"}] }]

从JSON.NET

Product product = new Product();
product.Name = "Apple";
product.Expiry = new DateTime(2008, 12, 28);
product.Price = 3.99M;
product.Sizes = new string[] { "Small", "Medium", "Large" };

string json = JsonConvert.SerializeObject(product);
//{
//  "Name": "Apple",
//  "Expiry": new Date(1230422400000),
//  "Price": 3.99,
//  "Sizes": [
//    "Small",
//    "Medium",
//    "Large"
//  ]
//}

Product deserializedProduct = JsonConvert.DeserializeObject<Product>(json);

这并非易事,但我个人将设置一个可以递归调用的函数,该函数会将节点添加到XML文件中。

我没有实际的代码,但是伪代码看起来像这样:(您将需要进行一些清理,因为我不需要Intellisense就能做到这一点。)

XmlDocument doc;

function SaveForm()
{
   doc = new XmlDocument("FormInfo");
   foreach(Control ctrl in this.Controls)
   {
      AddControlToXml(ctrl, doc.Documentelement);
   }
}

function AddControlToXml(Control ctrl, XmlNode currentNode)
{
   XmlNode n = new XmlNode;
   Node.InnerText = ctrl.Name;
   foreach(Control ctrl2 in ctrl.Controls)
   {
      AddControlToXml(ctrl2);
   }

}

尝试这个。 它使用ISerializationSurrogate接口解决表单对象不可序列化的问题:

如何使用代理序列化未标记为“可序列化”的对象。 http://www.codeproject.com/KB/dotnet/Surrogate_Serialization.aspx

您可以在运行时获取有关表单控件的位置,大小和其他属性,并将该状态保存在XML或JSON文件中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM