Сохранить WinForm или элементы управления в файл

Я работал над приложением, которое позволяет пользователю создавать шаблоны этикеток для печати, добавляя элементы управления этикетками на панель (которую я использую в качестве контейнера). Я достиг точки, когда мне нужно сохранить шаблон в файл, который я могу загрузить в память позже для печати. Поскольку форма не сериализуема, есть ли у кого-нибудь предложения о том, как сохранить форму или контейнер (с добавленными элементами управления метками) в файле, который можно будет использовать позже?

Благодарю.

6 ответов

Решение
  1. Создайте структуру, которая содержит достаточно информации (и не более) о каждом Label что вы можете восстановить Label от него.

  2. Напишите метод, который принимает List<MyStruct> и заполняет Panel из ваших структур.

  3. Напишите методы для сериализации и десериализации этого списка.

  4. Инкапсулируйте все это в классе.

Я бы не стал напрямую сериализовать форму в файл. Похоже, вам нужно создать класс, который будет содержать состояние работы пользователя. Затем вы должны сериализовать этот класс в файл и из файла. Для этого есть встроенные методы с использованием двоичной или 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. При возврате вы можете использовать универсальный метод, который перебирает и устанавливает свойства путем отражения. Также обратите внимание, что библиотека, с которой я связан, автоматически сериализует объекты, которые вы передаете ей.

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 или JSON.

Другие вопросы по тегам