как сохранить/восстановить форму и средства управления между прогонами программы?

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

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

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

6
задан John Saunders 7 July 2010 в 03:10
поделиться

6 ответов

Многие здесь говорят мне, когда сохранять, но не многие говорят, как ...

В конце концов, я выбрал WritePrivateProfileString ()

3
ответ дан 17 December 2019 в 07:00
поделиться

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

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

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

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

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

1
ответ дан 17 December 2019 в 07:00
поделиться

Сериализовать форму.

Реализуйте 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
ответ дан 17 December 2019 в 07:00
поделиться
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
0
ответ дан 17 December 2019 в 07:00
поделиться

На самом деле у меня есть несколько общих подпрограмм, которые я использую для сохранения размера / положения формы и 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 в поисках текстовых полей, флажков и т. Д.

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

0
ответ дан 17 December 2019 в 07:00
поделиться

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

В качестве места хранения настроек приложения я рекомендую использовать Isolated Storage.

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

0
ответ дан 17 December 2019 в 07:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: