如何在运行时在app.config中创建新用户设置

时间:2016-09-13 18:11:20

标签: c# wpf visual-studio

我有一个可编辑的ComboBox。用户输入文本并按下“保存”按钮。他们的文字变成了一个字符串。

我需要在运行时为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而不是字符串,但错误相同。文本和字符串也不为空。

Object customText = ComboBox1.Text;

这是我想要做的事情的视觉效果 Custom User Setting

1 个答案:

答案 0 :(得分: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");

编辑答案:

我做了一个快速的谷歌搜索,并在MSDN论坛上找到了一个接受的答案。MSDN question。您必须在属性类上调用save才能使add生效。想想数据库事务,直到你调用commit,它才会生效。

所以代码中似乎缺少的是Properties.Settings.Default.Save();,它应该是Settings.Default.Properties.Add(propertyCustom);

之后的下一行