C# 将WinForm或控件保存到文件
我一直在开发一个应用程序,该应用程序允许用户通过将标签控件添加到面板(我将其用作容器)来制作用于打印目的的标签模板。我已经到了需要能够将模板保存到文件中的地步,以后可以将其加载到内存中进行打印。由于表单是不可序列化的,有没有人对我如何将表单或容器(添加了标签控件)保存到一个文件中以供以后重用提出建议C# 将WinForm或控件保存到文件,c#,winforms,serialization,C#,Winforms,Serialization,我一直在开发一个应用程序,该应用程序允许用户通过将标签控件添加到面板(我将其用作容器)来制作用于打印目的的标签模板。我已经到了需要能够将模板保存到文件中的地步,以后可以将其加载到内存中进行打印。由于表单是不可序列化的,有没有人对我如何将表单或容器(添加了标签控件)保存到一个文件中以供以后重用提出建议 谢谢。就我个人而言,我会将其序列化为JSON。 当把它带回来时,你可以使用一个通用的方法 循环并通过反射设置属性。 还要注意,我链接到的库将自动序列化传递给它的对象 来自JSON.NET Pro
谢谢。就我个人而言,我会将其序列化为JSON。 当把它带回来时,你可以使用一个通用的方法 循环并通过反射设置属性。 还要注意,我链接到的库将自动序列化传递给它的对象 来自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);
产品产品=新产品();
product.Name=“苹果”;
产品有效期=新的日期时间(2008年12月28日);
产品价格=399万元;
product.size=新字符串[]{“小”、“中”、“大”};
字符串json=JsonConvert.SerializeObject(产品);
//{
//“名称”:“苹果”,
//“到期日”:新日期(1230422400000),
//“价格”:3.99,
//“尺寸”:[
//“小”,
//“中等”,
//“大”
// ]
//}
Product deserializedProduct=JsonConvert.DeserializeObject(json);
就我个人而言,我会将其序列化为JSON。
当把它带回来时,你可以使用一个通用的方法
循环并通过反射设置属性。
还要注意,我链接到的库将自动序列化传递给它的对象
来自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);
产品产品=新产品();
product.Name=“苹果”;
产品有效期=新的日期时间(2008年12月28日);
产品价格=399万元;
product.size=新字符串[]{“小”、“中”、“大”};
字符串json=JsonConvert.SerializeObject(产品);
//{
//“名称”:“苹果”,
//“到期日”:新日期(1230422400000),
//“价格”:3.99,
//“尺寸”:[
//“小”,
//“中等”,
//“大”
// ]
//}
Product deserializedProduct=JsonConvert.DeserializeObject(json);
您可以在运行时获取窗体控件的位置、大小和其他属性,并将该状态保存在XML或JSON文件中。您可以在运行时获取窗体控件的位置、大小和其他属性,并将该状态保存在XML或JSON文件中。这并不简单,但我个人会设置一个可以递归调用的函数,将节点添加到XML文件中
我没有实际的代码,但是伪代码看起来是这样的:(你需要做一些清理,因为我在没有Intellisense帮助的情况下做这件事。)
这并不简单,但我个人会设置一个可以递归调用的函数,将节点添加到XML文件中 我没有实际的代码,但是伪代码看起来是这样的:(你需要做一些清理,因为我在没有Intellisense帮助的情况下做这件事。) 试试这个。它使用接口来解决表单对象不可序列化的问题: 如何使用代理序列化未标记为“可序列化”的对象。 试试这个。它使用接口来解决表单对象不可序列化的问题: 如何使用代理序列化未标记为“可序列化”的对象。
我不会直接将表单序列化为文件。听起来您需要创建一个类来保存用户的工作状态。然后,您应该在文件中序列化该类。有使用二进制或XML序列化的内置方法 我不会直接将表单序列化为文件。听起来您需要创建一个类来保存用户的工作状态。然后,您应该在文件中序列化该类。有使用二进制或XML序列化的内置方法
标签
的足够信息(不再包含),您可以从中重新构建标签
列表
并填充面板
标签
的足够信息(不再包含),您可以从中重新构建标签
列表
并填充面板
在我看来像是C。(除了JavaScript函数声明)我没有看到这里的递归。。。这是一级迭代。。AddControlToXml正在调用AddControlToXml。。。根据传递给它的控件的子控件根据需要调用自身的子例程。。。递归的定义是什么?@chaospanion-谢谢你的编辑。我正要出门去参加一个会议,因为我正在结束会议。我没有意识到我忘了将其格式化为代码。在我看来像C。(除了JavaScript函数声明)我没有看到这里的递归。。。这是一级迭代。。AddControlToXml正在调用AddControlToXml。。。根据传递给它的控件的子控件根据需要调用自身的子例程。。。递归的定义是什么?@chaospanion-谢谢你的编辑。我正要出门去参加一个会议,因为我正在结束会议。我没有意识到我忘了将其格式化为代码。@Nathan:请注意,如果使用此方法,则必须根据state类中的数据再次动态创建控件。这可能不会有问题。我会得到重要的财产
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);
}
}