Как сохранить элементы управления, созданные во время выполнения, в Windows Forms
Вот мой код
private void make_Book(int x, int y, string name)
{
#region Creating Book
// this code is initializing the book(button)
Button book1 = new Button();
Image img = button1.Image;
book1.Image = img;
book1.Name = name;
book1.Height = img.Height;
book1.Width = img.Width;
book1.Location = new Point(44 + x, 19 + y);
book1.Click += new EventHandler(myClickHandler);
groupBox1.Controls.Add(book1);
#endregion
}
этот код создает кнопку каждый раз, когда я нажимаю на кнопку, теперь я хочу сохранить созданную кнопку и ее свойство, чтобы они могли появляться при каждом запуске приложения.
закодировано в C# visual studio 2010...
3 ответа
Одним из решений может быть использование StringCollection
пользовательские настройки (РЕДАКТИРОВАТЬ: в своем комментарии вы говорите, что это не будет сохраняться при закрытии приложения. Это не так, поскольку в этом весь смысл использования пользовательских настроек...).
В каждой строке необходимо сохранить позицию и имя элемента управления в виде строки, например, как
120;140;MyName
Когда пользователь добавляет новую кнопку, создайте элемент в StringCollection
вот так:
private void make_BookButtonAndStore(int x, int y, string name)
{
make_Book(x,y,name);
Properties.Settings.Default.ButtonStringCollection.Add(String.Format("{0};{1};{2}", book1.Location.X, book1.Location.Y, book1.Name));
Properties.Settings.Default.Save();
}
private void make_Book(int x, int y, string name)
{
// this code is initializing the book(button)
Button book1 = new Button();
Image img = button1.Image;
book1.Image = img;
book1.Name = name;
book1.Height = img.Height;
book1.Width = img.Width;
book1.Location = new Point(44 + x, 19 + y);
book1.Click += new EventHandler(myClickHandler);
groupBox1.Controls.Add(book1);
}
Тогда вам нужен код, который создает кнопки из каждого элемента в StringCollection
читая каждую строку, извлекая местоположение и имя и вызывая make_book
опять (не мой новый make_BookButtonAndStore
метод, так как это бы удвоить кнопку).
Обратите внимание, что вам может понадобиться создать StringCollection
с new
Ключевое слово перед добавлением первой кнопки.
РЕДАКТИРОВАТЬ
Чтобы объяснить, как создать такой параметр: Перейдите в свойства своего проекта на вкладку "Настройки". Создайте новый параметр с именем ButtonStringCollection
выберите тип System.Collections.Specialized.StringCollection
и сфера User
,
В конструкторе формы добавьте следующую строку:
if (Properties.Settings.Default.ButtonStringCollection == null)
Properties.Settings.Default.ButtonStringCollection = new StringCollection();
Затем добавьте приведенный выше код для создания кнопок. Кроме того, в форме Load
обработчик событий, добавьте что-то вроде следующего:
foreach (string line in Properties.Settings.Default.ButtonStringCollection)
{
if (!String.IsNullOrWhitespace(line))
{
// The line will be in format x;y;name
string[] parts = line.Split(';');
if (parts.Length >= 3)
{
int x = Convert.ToInt32(parts[0]);
int y = Convert.ToInt32(parts[1]);
make_Book(x, y, parts[2]);
}
}
}
Это пример того, как сохранить загрузку XML.
public static void Save(string x, string y, string name)
{
if (!Directory.Exists(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\appName"))
{
Directory.CreateDirectory(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\appName");
}
XmlDocument xmlDocument = new XmlDocument();
string xml = string.Format(@"<?xml version='1.0' encoding='utf-8'?><button><x>{0}</x><y>{1}</y><name>{2}</name></button>", x, y, name);
xmlDocument.LoadXml(xml);
xmlDocument.Save(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\appName\\button.xml");
}
public static Dictionary<string,string> Load()
{
string address = "";
if (!File.Exists(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\appName\\button.xml"))
{
return new Dictionary<string,string>(){{"x",""},{"y",""},{"name",""}};
}
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\appName\\button.xml");
XmlNode button = xmlDocument.GetElementsByTagName("button").Item(0);
XmlNode nameNode = button.SelectSingleNode("name");
XmlNode xNode = button.SelectSingleNode("x");
XmlNode yNode = button.SelectSingleNode("y");
return new Dictionary<string, string>() { { "name", nameNode.InnerText }, { "x", xNode.InnerText }, { "y", yNode.InnerText } };
}
Когда ты звонишь make_Book
Этот метод позволяет сохранить входные параметры в базе данных или другом хранилище, используемом в данный момент вашим приложением. При запуске приложения вы можете загрузить все кнопки, позвонив make_Book
метод со значениями, сохраненными в хранилище вашего приложения.