我一直在研究一个应用程序,它允许用户通过向面板(我用作容器)添加标签控件来制作用于打印目的的标签模板。我已经达到了需要将模板保存到一个文件的地步,以后我可以将它加载到内存中进行打印。由于表单不是可序列化的,任何人都不知道如何将表单或容器(添加了标签控件)保存到可以稍后重用的文件中?将WinForm或控件保存到文件
谢谢。
我一直在研究一个应用程序,它允许用户通过向面板(我用作容器)添加标签控件来制作用于打印目的的标签模板。我已经达到了需要将模板保存到一个文件的地步,以后我可以将它加载到内存中进行打印。由于表单不是可序列化的,任何人都不知道如何将表单或容器(添加了标签控件)保存到可以稍后重用的文件中?将WinForm或控件保存到文件
谢谢。
创建关于每个Label
包含足够的信息(没有更多)的结构体,你可以从它重构Label
。
编写一个方法,它需要一个List<MyStruct>
并从您的结构中填充Panel
。
编写方法来序列化和反序列化这个列表。
封装在一个类的整个事情。
就我个人而言,我会将其序列化为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);
从未使用JSON,但我不反对学习新事物。 – Nathan 2009-11-03 19:32:18
你能得到关于窗体的控件在运行时的位置,大小和其他属性和保存状态在XML或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);
}
}
看起来像C#给我。 (除了JavaScript函数声明) – ChaosPandion 2009-11-03 19:25:27
我没有在这里看到递归...这是第一级迭代 – jmayor 2009-11-03 20:02:29
以及两级迭代..你不会进一步说第一个容器.. – jmayor 2009-11-03 20:04:05
试试这个。它使用ISerializationSurrogate
接口来解决表单对象不可序列化的问题:
如何序列化未使用代理标记为“可序列化”的对象。 http://www.codeproject.com/KB/dotnet/Surrogate_Serialization.aspx
我不会直接将表格序列化为文件。听起来你需要创建一个能够保持用户工作状态的类。然后,您应该将该类序列化为文件并从文件中进行序列化。内置的方法使用二进制或XML序列化。
@Nathan:请注意,如果使用此方法,则必须根据状态类中存在的数据再次动态地创建控件。 – 2009-11-03 20:02:15
这可能不会成为问题。我只想从每个控件获取重要的属性信息,然后将其序列化为文件正确的? – Nathan 2009-11-03 20:11:56
这正是我在阅读OG的答案后所想到的。谢谢! – Nathan 2009-11-03 20:30:28
把它全部编码起来,它现在工作完美。非常感谢大家。 – Nathan 2009-11-03 22:08:29