Почему ApplicationSettingsBase.Reset() очищает значения свойств?

Я думал, что метод Reset() снова заполняет настройки значениями по умолчанию, но, похоже, это не так. Как я могу перезагрузить их со значениями по умолчанию?

  private void buttonLoadDefaultSettings_Click(object sender, EventArgs e)
  {
   FooSettings.Default.Reset();

   // Data grid will show an empty grid after call to reset.
   DataGridFoo.Rows.Clear();
   foreach (SettingsPropertyValue spv in FooSettings.Default.PropertyValues)
   {
    DataGridFoo.Rows.Add(spv.Name, spv.PropertyValue);
   }
  }

Обновить

private void buttonLoadDefaultSettings_Click(object sender, EventArgs e)
  {
   foreach (SettingsProperty sp in FooSettings.Default.Properties)
   {
    FooSettings.Default[sp.Name.ToString()] = sp.DefaultValue;
   }

   DataGridFoo.Rows.Clear();
   foreach (SettingsPropertyValue spv in FooSettings.Default.PropertyValues)
   {
    DataGridFoo.Rows.Add(spv.Name, spv.PropertyValue);
   }
  }

Удален вызов Reset() и вручную установлены значения свойств, сохраненные по умолчанию. Мне все еще не терпится услышать, так ли это должно использоваться, или я что-то упустил?


person Ashley Simpson    schedule 28.10.2009    source источник
comment
Причина, по которой это происходит, заключается в том, что по какой-либо причине коллекция PropertyValues не заполняется при инициализации, а вместо этого откладывается до тех пор, пока вы сначала не получите какое-либо значение свойства. Сброс объекта настроек сбрасывает все, включая начальное состояние 0-элемента PropertyValues. См. отмеченный дубликат.   -  person Peter Duniho    schedule 01.08.2019


Ответы (1)


Я наткнулся на эту тему, потому что столкнулся с той же проблемой. Я решил, что сообщу о своих находках всем будущим путешественникам, которые могут пройти этим путем. Я не могу обещать, что это на 100% точно или полно, потому что я возился с этим в течение часа, и этого достаточно для одного дня, хотя я чувствую, что мне еще многое предстоит узнать. Но, по крайней мере, они будут некоторые советы здесь. :)

Хотя документация для Reset() указывает, что сохраненные настройки в файле user.config перезаписываются значениями по умолчанию из файла app.config, это не так. Он просто стирает настройки из файла user.config, что в приведенном выше примере приводит к тому, что FooSettings.Default.PropertyValues имеет счетчик 0, поскольку после использования Reset() ничего не существует. Но есть способы работать с этим результатом, которые не требуют повторного заполнения настроек, как это делал OP. Один из способов — явно получить значения отдельных настроек следующим образом:

// This always returns the value for TestSetting, first checking if an
// appropriate value exists in a user.config file, and if not, it uses 
// the default value in the app.config file.
FormsApp.Properties.Settings.Default.TestSetting;

Другие способы включают использование SettingsPropertyValueCollection и/или SettingsPropertyCollection:

// Each SettingsProperty in props has a corresponding DefaultValue property
// which returns (surprise!) the default value from the app.config file.
SettingsPropertyCollection props = FormsApp.Properties.Settings.Default.Properties;

// Each SettingsPropertyValue in propVals has a corresponding PropertyValue
// property which returns the value in the user.config file, if one exists.
SettingsPropertyValueCollection propVals = FormsApp.Properties.Settings.Default.PropertyValues;

Итак, возвращаясь к первоначальному вопросу, вы могли бы сделать следующее:

private void buttonLoadDefaultSettings_Click(object sender, EventArgs e)
{
    FooSettings.Default.Reset();
    DataGridFoo.Rows.Clear();

    // Use the default values since we know that the user settings 
    // were just reset.
    foreach (SettingsProperty sp in FooSettings.Default.Properties)
    {
        DataGridFoo.Rows.Add(sp.Name, sp.DefaultValue);
    }
}
person Nick Spreitzer    schedule 22.04.2010