我有一个可编辑的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;
答案 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);