簡體   English   中英

將WinForm或控件保存到文件

[英]Save WinForm or Controls to File

我一直在開發一個應用程序,該應用程序允許用戶通過將標簽控件添加到面板(我用作容器)來制作用於打印目的的標簽模板。 我已經達到了需要將模板保存到文件中的目的,以后可以將其加載到內存中進行打印。 由於表單不可序列化,因此有人對我如何將表單或容器(帶有添加的標簽控件)保存到文件中以供日后重用的建議嗎?

謝謝。

我不會直接將表格序列化為文件。 聽起來您需要創建一個類來保存用戶工作的狀態。 然后,您應該將該類與文件進行序列化。 有使用二進制或XML序列化的內置方法。

  1. 創建一個結構,該結構包含有關每個Label足夠信息(且不再包含),您可以從中重構Label

  2. 編寫一個方法,該方法采用List<MyStruct>並從結構中填充Panel

  3. 編寫方法以序列化和反序列化此列表。

  4. 將整個內容封裝在一個類中。

就個人而言,我會將其序列化為JSON。 當帶回它時,可以使用遍歷並通過反射設置屬性的通用方法。 還要注意,我鏈接到的庫將自動序列化傳遞給它的對象。

JSON格式

JSON.NET

[{ "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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM