Сохранить WinForm или элементы управления в файл
Я работал над приложением, которое позволяет пользователю создавать шаблоны этикеток для печати, добавляя элементы управления этикетками на панель (которую я использую в качестве контейнера). Я достиг точки, когда мне нужно сохранить шаблон в файл, который я могу загрузить в память позже для печати. Поскольку форма не сериализуема, есть ли у кого-нибудь предложения о том, как сохранить форму или контейнер (с добавленными элементами управления метками) в файле, который можно будет использовать позже?
Благодарю.
6 ответов
Создайте структуру, которая содержит достаточно информации (и не более) о каждом
Label
что вы можете восстановитьLabel
от него.Напишите метод, который принимает
List<MyStruct>
и заполняетPanel
из ваших структур.Напишите методы для сериализации и десериализации этого списка.
Инкапсулируйте все это в классе.
Я бы не стал напрямую сериализовать форму в файл. Похоже, вам нужно создать класс, который будет содержать состояние работы пользователя. Затем вы должны сериализовать этот класс в файл и из файла. Для этого есть встроенные методы с использованием двоичной или XML-сериализации.
Это не тривиально, но лично я бы настроил функцию, которую можно вызывать рекурсивно, чтобы добавить узлы в файл 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
Лично я бы сериализовал его как 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 или JSON.