将WinForm或控件保存到文件

时间:2009-11-03 19:13:23

标签: c# winforms serialization

我一直致力于一个应用程序,它允许用户通过向面板(我用作容器)添加标签控件来制作用于打印目的的标签模板。我已经达到了我需要能够将模板保存到文件的程度,我可以在以后加载到内存中进行打印。由于表单不可序列化,是否有人建议如何将表单或容器(添加标签控件)保存到以后可以重用的文件中?

感谢。

6 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

  1. 创建一个结构,其中包含有关每个Label的足够信息(而不是更多),您可以从中重新构建Label

  2. 编写一个方法,该方法需要List<MyStruct>并填充结构中的Panel

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

  4. 将整个事物封装在一个类中。

答案 2 :(得分:1)

就个人而言,我会将其序列化为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);

答案 3 :(得分:1)

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

我没有实际的代码,但伪代码看起来像这样:(你需要做一些清理工作,因为我在没有Intellisense的帮助下做到了这一点。)< / p>

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

}

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

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