我一直在研究一個應用程序,它允許用戶通過向面板(我用作容器)添加標籤控件來製作用於打印目的的標籤模板。我已經達到了需要將模板保存到一個文件的地步,以後我可以將它加載到內存中進行打印。由於表單不是可序列化的,任何人都不知道如何將表單或容器(添加了標籤控件)保存到可以稍後重用的文件中?將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