[英]Save WinForm or Controls to File
我一直在开发一个应用程序,该应用程序允许用户通过将标签控件添加到面板(我用作容器)来制作用于打印目的的标签模板。 我已经达到了需要将模板保存到文件中的目的,以后可以将其加载到内存中进行打印。 由于表单不可序列化,因此有人对我如何将表单或容器(带有添加的标签控件)保存到文件中以供日后重用的建议吗?
谢谢。
我不会直接将表格序列化为文件。 听起来您需要创建一个类来保存用户工作的状态。 然后,您应该将该类与文件进行序列化。 有使用二进制或XML序列化的内置方法。
创建一个结构,该结构包含有关每个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);
这并非易事,但我个人将设置一个可以递归调用的函数,该函数会将节点添加到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.