Как сохранить / восстановить форму и элементы управления между запусками программы? - PullRequest
6 голосов
/ 07 июля 2010

У меня есть сложная форма, позволяющая пользователю настроить мое приложение.

Какой лучший способ сохранить состояние формы и перезагрузить ее при следующем запуске программы.

Я имею в виду текст, который он ввел в списках, выбранный элемент со списком / списком / радио, проверен ли флажок и т.д.

Ответы [ 7 ]

3 голосов
/ 12 июля 2010

Многие люди здесь говорят мне, когда нужно экономить, но не многие говорят мне, как ...

В конце концов я пошел с WritePrivateProfileString ()

1 голос
/ 07 июля 2010

Сериализация формы.

Реализация ISerializable, а в сериализуемом конструкторе и методе GetObject () загрузка / сохранение ваших полей.

В OnClosing сериализовать форму.

    /// 
    /// try to obtain the las serialized main form with old data
    MainForm mainForm = DeserializeMainForm("mainForm.data");
    ///
    /// if any old data found, create a new(empty) main form
    if (mainForm == null) mainForm = new MainForm();

    static MainForm DeserializeMainForm(string filePath)
    {
        MainForm mf = null;
        FileStream fileStream = null;
        try
        {
            BinaryFormatter binaryFormatter = new BinaryFormatter();
            fileStream = new FileStream(filePath, FileMode.Open);
            mf = (MainForm)binaryFormatter.Deserialize(fileStream);
        }
        catch { }
        finally
        {
            if (fileStream != null)
            {
                fileStream.Close();
            }
        }

        return mf;
    }

MainForm:

[Serializable]
public partial class MainForm : Form, ISerializable
{
        protected MainForm(SerializationInfo info, StreamingContext context)
        : this()
    {
        if (info == null)
            throw new System.ArgumentNullException("info");

        this.tbxServerIp.Text = info.GetString("server ip");
        this.tbxServerPort.Text = info.GetString("server port");
        this.tbxEventFilter.Text = info.GetString("event filter");
        this.tbxWallId.Text = info.GetString("wallId");

        foreach (Control control in this.Controls)
        {
            if (control is EventSender)
            {
                EventSender eventSender = (control as EventSender);
                eventSender.LoadFromSerializationInfo(info);
            }
        }   
    }

    private void SerializeThis()
    {
        BinaryFormatter binaryFormatter = new BinaryFormatter();
        FileStream fileStream = new FileStream("mainForm.data", FileMode.Create);
        try
        {
            binaryFormatter.Serialize(fileStream, this);
        }
        catch
        {
            throw;
        }
        finally
        {
            fileStream.Close();
        }
    }

    protected override void OnClosing(CancelEventArgs e)
    {
        SerializeThis();
        base.OnClosing(e);
    }
}
1 голос
/ 07 июля 2010

У вас есть несколько вариантов сохранения введенных настроек - в файле конфигурации или в реестре, может быть, в базе данных (может быть, даже в «облаке», но я туда не пойду).

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

То, как вы сохраняете настройки, полностью зависит от вас - вы можете сохранить их в конфигурационном файле с парой имен и значений, вы можете использовать XML в конфигурационном файле или сохранить их в виде ключей и значений в известное место в реестре (или вы можете сохранить пары имя / значение в таблице базы данных).

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

Редактировать: после прочтения вашего комментария к другому ответу, вот еще один вариант, немного более продвинутый. Используйте класс настроек, о котором я упоминал ранее, но также используйте привязку - вы можете привязать ваш объект настроек непосредственно к вашей форме, поэтому любые введенные значения будут обновляться непосредственно в объект настроек без необходимости писать код для этого (при условии, что вы используете два способ связывания). «Потоковая передача» может быть достигнута путем сериализации объекта настроек в файл (или базу данных), я предлагаю вам взглянуть на XmlSerializer .

0 голосов
/ 17 сентября 2012

Вы можете как-то сохранить все в скрытом textbox в скрытом виде. Когда пользователь нажимает кнопку apply, автоматически откройте текстовый файл и заставьте программу читать его построчно.

Пример:

  • Строка 1 может быть местоположением изображения
  • Строка 2 может быть текстом для текстового поля
  • Строка 3 может быть словом или числом, которое программа использует, чтобы определить, является ли флажок является истинным или ложным
0 голосов
/ 07 июля 2010

Я также согласен на наличие LoadSettings/SaveSettings набора функций, которые вызываются при создании формы / при закрытии приложения.

В качестве места хранения настроек приложения я рекомендую использовать ИзолированныйХранилище .

Кроме того, в зависимости от элементов управления, которые вы используете в своей форме, вы можете сохранить их статус в формате XML и затем восстановить его в следующий раз.Например, элементы управления Infragistics предоставляют такую ​​возможность (например, UltraDockManager , UltraToolbarManager имеют пару функций SaveAsXml/LoadFromXml).

0 голосов
/ 07 июля 2010

У меня на самом деле есть пара общих процедур, которые я использую для сохранения размера / позиции формы и настроек столбца ListView.Таким образом, у меня есть что-то вроде ...

Private Sub frm_Closing (sender as Object, e as CancelEventArgs) Handles MyBase.Closing

   SaveFormPos(Me)
   SaveListview(Me, lvuInvoices)

End Sub

Private Sub frm_Load(sender as Object, e as EventArgs) Handles MyBase.Load

   RestoreFormPos(Me)
   RestoreListview(Me, lvuInvoices)

End Sub

Параметр Me (для подпрограммы Listview) используется для создания ключа для значений, которые будут сохранены в реестре.У вас есть все виды вариантов перед вами.Вы можете поместить эту функциональность в базовый класс для всех ваших форм, создать класс SaveState или просто вставить процедуры в модуль.Вы можете сохранить эти данные в реестр, базу данных, текстовые файлы.У вас может быть общая подпрограмма, которая просматривает коллекцию Controls в поисках TextBoxes, Checkboxes и т. Д.

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

0 голосов
/ 07 июля 2010
Private Sub frm_Closing (sender as Object, e as CancelEventArgs) Handles MyBase.Closing

   ' save all the values you want'

End Sub

Private Sub frm_Load(sender as Object, e as EventArgs) Handles MyBase.Load

   If SaveSettingsExist Then
      ' restore all the values you want'
   End If

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...