我一直致力于一个应用程序,它允许用户通过向面板(我用作容器)添加标签控件来制作用于打印目的的标签模板。我已经达到了我需要能够将模板保存到文件的程度,我可以在以后加载到内存中进行打印。由于表单不可序列化,是否有人建议如何将表单或容器(添加标签控件)保存到以后可以重用的文件中?
感谢。
答案 0 :(得分:4)
我不会直接将表单序列化为文件。听起来你需要创建一个能够保持用户工作状态的类。然后,您应该将该类与文件序列化。使用二进制或XML序列化的内置方法。
答案 1 :(得分:2)
创建一个结构,其中包含有关每个Label
的足够信息(而不是更多),您可以从中重新构建Label
。
编写一个方法,该方法需要List<MyStruct>
并填充结构中的Panel
。
编写序列化和反序列化此列表的方法。
将整个事物封装在一个类中。
答案 2 :(得分:1)
就个人而言,我会将其序列化为JSON。 将其带回来时,您可以使用通用方法 循环并通过反射设置属性。 另请注意,我链接到的库将自动序列化您传递给它的对象。
[{ "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文件中。