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