У меня есть сложная форма, чтобы позволить пользователю настраивать мое приложение.
Что лучший способ состоит в том, чтобы сохранить состояние формы и перезагрузку когда следующие запуски программы.
Я имею в виду текст, который он ввел в полях списков, выбранном пункте комбинации/списка/радио, говорят ли флажку дерзости и т.д.
Многие здесь говорят мне, когда сохранять, но не многие говорят, как ...
В конце концов, я выбрал WritePrivateProfileString ()
У вас есть несколько вариантов, где сохранить введенные настройки - в конфигурационном файле, или в реестре, может быть, в базе данных (может быть, даже в "облако", но я туда ходить не буду).
Вы должны попрошу пользователя выполнить определенное действие (например, нажать кнопку Apply), прежде чем сохранять настройки - вы не должны просто сохранять настройки, когда пользователь закрывает форму, так как это в конечном итоге не очень хороший UX.
Как вы сохраняете настройки полностью от вас - вы можете сохранить их в файл конфигурации стиля прямой пары имя/значение, Возможно, вы захотите использовать XML в конфигурационном файле, или вы сохраняете их как ключи и значения в известном месте реестра (или вы можете сохранить пары имя-значение в таблице базы данных).
При следующем запуске приложения одной из задач запуска может быть проверка известного расположения (будь то реестр или файл конфигурации) параметров, а затем загрузка их в класс параметров. Убедитесь, что у вас есть логические значения по умолчанию для каждого параметра, если он либо никогда не был установлен, либо по какой-то причине вы не можете прочитать его обратно. Затем класс settings может быть либо передан в каждую форму, чтобы он мог применять любые релевантные параметры, либо это может быть статический класс (глобально видимый класс одного экземпляра), чтобы его можно было просто считывать из любого места в приложении.
Правка: после прочтения вашего комментария к другому ответу, вот еще один вариант, немного более продвинутый. Используйте класс настроек, о котором я упоминал ранее, но также используйте привязку - вы можете привязать объект настроек непосредственно к вашей форме, таким образом, любые введенные значения будут обновляться непосредственно в объекте настроек без необходимости написания кода для этого (при условии, что вы используете двусторюю привязку). «Потоковая передача» может быть достигнута путем сериализации объекта настроек в файл (или базу данных), я предлагаю вам взглянуть на XmlSerializer.
Сериализовать форму.
Реализуйте 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);
}
}
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
На самом деле у меня есть несколько общих подпрограмм, которые я использую для сохранения размера / положения формы и 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 в поисках текстовых полей, флажков и т. Д.
Однако, как только вы создали полезный набор процедур сохранения, вы можете затем использовать их в любой последующей форме, которую захотите, чтобы вы нужно только один раз проделать тяжелую работу.
Я также согласен с наличием LoadSettings/SaveSettings
набора функций, которые вызываются при создании формы/при закрытии приложения.
В качестве места хранения настроек приложения я рекомендую использовать Isolated Storage.
В качестве дополнения, в зависимости от элементов управления, которые вы используете на форме, вы можете сохранить их состояние в формате XML, а затем восстановить его в следующий раз.
Например, Infragistics элементы управления предлагают такую возможность (например, UltraDockManager, UltraToolbarManager имеют пару функций SaveAsXml/LoadFromXml
).