Почему ApplicationSettingsBase.Reset () очищает PropertyValues? - PullRequest
0 голосов
/ 28 октября 2009

Я думал, что метод 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 () и вручную установил значения свойств на значения по умолчанию. Я все еще хочу услышать, если это так, как это должно быть использовано, или я что-то упустил?

1 Ответ

1 голос
/ 23 апреля 2010

Я наткнулся на эту тему, потому что столкнулся с той же проблемой. Я подумал, что сообщу о своих выводах для любых будущих путешественников, которые могут прийти сюда. Я не могу обещать, что это на 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);
    }
}
...