Как сохранить элементы управления, созданные во время выполнения, в 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 ...

 Adam Houldsworth24 мая 2012 г., 16:37
Вы не можете сохранить кнопку напрямую, но вы можете сохранить детали, которые были использованы для создания кнопки, а именно:x, y а такжеname.
 jrb24 мая 2012 г., 16:39
serialize / deserialize to xml
 SimpleVar24 мая 2012 г., 16:39
Continuing @AdamHouldsworth: а затем загрузите все сохраненные детали из этого хранилища и заново создайте кнопки в соответствии с этими загруженными деталями в начале работы.
 Arsalan Saleem24 мая 2012 г., 16:38
Значит, я не могу перезагрузить кнопки, созданные пользователем ??
 Adam Houldsworth24 мая 2012 г., 16:39
Вы можете перезагрузить их, но вы не можете сохранить кнопку как объект и ожидать, что она будет связана с родителями и ручками. Лучше сохранить детали, использованные при создании кнопки, и загрузить их из файла, когда вам нужно, снова вызвав свой метод.

Ответы на вопрос(3)

make_Book метод, вы можете сохранить входные параметры в базу данных или другое хранилище, используемое в данный момент вашим приложением. При запуске приложения вы можете загрузить все кнопки, позвонивmake_Book метод со значениями, сохраненными в хранилище вашего приложения.

Сохранение и восстановление настроек формы .NET с использованием XML Загрузка и сохранение объектов в XML с использованием сериализации Настройки пользователя Windows Forms в C #
 Arsalan Saleem24 мая 2012 г., 16:53
Хммм, дай мне попробовать это, я спрошу здесь снова, этот ответ на самом деле приходит мне в голову;)
 banging24 мая 2012 г., 16:58
Это именно то, что все пытаются сказать тебе !!

как сохранить загрузку 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 } };
    }
 Arsalan Saleem24 мая 2012 г., 17:12
XmlNode nameNode = settings.SelectSingleNode ("name"); XmlNode xNode = settings.SelectSingleNode ("x"); XmlNode yNode = settings.SelectSingleNode ("y"); где найти настройки, это те же настройки, о которых говорил Торстен Диттмар ??
 Thorsten Dittmar24 мая 2012 г., 18:08
Нет, это решение XML, которое не имеет ничего общего с тем, что я предложил. Это так же хорошо, но это не то же самое, что делать с настройками пользователя.
 jrb28 мая 2012 г., 14:27
Sry, «установка» должна быть «кнопка», я обновил пример
Решение Вопроса

StringCollection пользовательские настройки ( EDIT: в своем комментарии вы говорите, что это не будет сохраняться при закрытии приложения. Это неправда, так как в этом весь смысл использования пользовательских настроек ...).

В каждой строке необходимо сохранить позицию и имя элемента управления в виде строки, например, как

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]);
        }
    }
}
 Thorsten Dittmar24 мая 2012 г., 16:52
Нет, не будет. Говорят пользовательские настройки. Вам нужно правильно прочитать ответ.
 Arsalan Saleem24 мая 2012 г., 16:51
спасибо, приятель, но я думаю, что данные будут удалены из коллекции строк, когда я закрою приложение
 Arsalan Saleem24 мая 2012 г., 16:56
okk ,, спасибо ,, извините, я не слышал о пользовательских настройках, прежде чем я ищу об этом Спасибо, кстати ..
 Damith24 мая 2012 г., 17:17
1 + хорошее объяснение
 Thorsten Dittmar24 мая 2012 г., 17:01
Нет проблем. Я отредактировал ответ и добавил много кода, который должен вам помочь.

Ваш ответ на вопрос