2016-09-13 5 views
0

У меня есть Editable ComboBox. Пользователь вводит текст и нажимает кнопку «Сохранить». Их текст превращается в строку.Как создать новую настройку пользователя в app.config во время выполнения

Мне нужно это во время выполнения, чтобы создать новую настройку пользователя для app.config с именем их строки. (Я думаю, что эта часть работает сейчас).

Затем другой выбранный элемент ComboBox сохраняется в настройке. (Ссылка на объект не установлена).

Это создание пользовательского пресета, в котором будут сохранены каждое состояние управления, флажки, текстовые поля и т. Д. В программе.

// Control State to be Saved to Setting 
Object comboBox2Item = ComboBox2.SelectedItem; 

// User Custom Text 
string customText = ComboBox1.Text; 

// Create New User Setting 
var propertyCustom = new SettingsProperty(customText); 
propertyCustom.Name = customText; 
propertyCustom.PropertyType = typeof(string); 
Settings.Default.Properties.Add(propertyCustom); 

// Add a Control State (string) to the Setting 
Settings.Default[customText] = (string)comboBox2Item; 

С этой частью я получаю сообщение об ошибке.

Settings.Default[customText] = (string)comboBox2Item; 

Исключение: Метательное: «Ссылка на объект не указывает на экземпляр объекта.»

Я пробовал настройку ComboBox1.Text для объекта вместо строки с той же ошибкой. Текст и строка также не являются нулевыми.

Object customText = ComboBox1.Text; 

Вот визуальное того, что я пытаюсь сделать Custom User Setting

+0

без проверки, вероятно, нужно сохранить конфигурации, а затем перезагрузить его. Имейте в виду, что многие настройки, которые вы используете с помощью кода, выполняются через класс, создаваемый визуальной студией при изменении конфигурации через конструктор. Существуют классы конфигурации XML, которые вы можете проанализировать и вручную изменить файл конфигурации, но XSD не проверяет ваши изменения до их сохранения. Соблюдайте осторожность, так как вы можете изменить конфигурацию в состояние, когда ваше приложение не запускается из-за неправильной маркировки конфигурации. – xtreampb

+0

@xtreampb Я обновил свой код. Я думаю, что он создал параметр в app.config и выполняет этот код, но он дает ту же ошибку при попытке добавить строку в настройку. –

+0

Я думаю, что ошибка возникает, потому что 'Settings.Default [customText]' не компилируется в класс настроек. В своем браузере решений разверните 'properties/settings.settings/settings.designer.cs' и вы увидите все элементы в экземпляре по умолчанию.Когда вы добавляете этот параметр, перед его вызовом вам может потребоваться сохранить, а затем перезагрузить файл настроек. – xtreampb

ответ

0

Оригинал Ответ:

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

Я попытаюсь обновить, чтобы ответить на этот вопрос, как только у меня появится некоторое время для дыхания.

public static void UpdateConfig(string setting, string value, bool isUserSetting = false) 
    { 
     var assemblyPath = AppDomain.CurrentDomain.BaseDirectory; 
     var assemblyName = "AssemblyName"; 

     //need to modify the configuration file, launch the server with those settings. 
     var config = 
      ConfigurationManager.OpenExeConfiguration(string.Format("{0}\\{1}.exe", assemblyPath, "AssemblyName")); 

     //config.AppSettings.Settings["Setting"].Value = "false"; 
     var getSection = config.GetSection("applicationSettings"); 
     Console.WriteLine(getSection); 

     var settingsGroup = isUserSetting 
      ? config.SectionGroups["userSettings"] 
      : config.SectionGroups["applicationSettings"]; 
     var settings = 
      settingsGroup.Sections[string.Format("{0}.Properties.Settings", assemblyName)] as ClientSettingsSection; 
     var settingsElement = settings.Settings.Get(setting); 

     settings.Settings.Remove(settingsElement); 
     settingsElement.Value.ValueXml.InnerText = value; 
     settings.Settings.Add(settingsElement); 

     config.Save(ConfigurationSaveMode.Modified); 
     ConfigurationManager.RefreshSection("appSettings"); 

Отредактировано Ответ:

Я сделал быстрый поиск Google и нашел принятый ответ на форуме MSDN. MSDN question. Вы должны вызвать save в классе свойств, чтобы добавление могло повлиять. Подумайте о транзакции базы данных, пока вы не назовете commit, она не вступает в силу.

Так что, как представляется, отсутствует в вашем коде: Properties.Settings.Default.Save();, который должен быть очень следующей строке после вашего Settings.Default.Properties.Add(propertyCustom);

+0

Я попытался добавить свойство Properties.Settings.Default.Save() ;, но ошибка все еще возникает при попытке добавить строку в настройку. Я думаю, что имя настройки было создано, но я не могу добавить к нему. Я уточнил свой вопрос, чтобы быть более ясным. –

Смежные вопросы