自定义ConfigurationHelper加载配置时settingControlPairs列表为空的修复方案
修正配置加载时
settingControlPairs为空的问题 核心问题分析
当前逻辑的问题在于:settingControlPairs列表仅在用户触发保存操作(如修改文本框内容)时才会添加条目,但程序启动后调用LoadConfiguration时,该列表还没有任何内容,导致遍历加载逻辑无法执行。
1. 提前注册所有配置项与控件的绑定
在窗体初始化阶段(比如InitializeUI方法中),将所有需要保存/加载的控件与对应的配置键提前添加到settingControlPairs列表中,确保程序启动时列表已有内容。
修改Form1的InitializeUI方法:
private void InitializeUI() { // 注册所有需要绑定的配置项与对应控件 settingControlPairs.Add(new SettingControlPair { Key = "LensSize", Control = textBoxLensSize }); // 若有其他需要配置的控件,按同样方式注册 // settingControlPairs.Add(new SettingControlPair { Key = "AutoCropEnabled", Control = checkBoxAutoCrop }); // settingControlPairs.Add(new SettingControlPair { Key = "OutputQuality", Control = numericUpDownQuality }); }
2. 修改SaveConfiguration方法,避免重复添加条目
原方法每次保存都会向列表添加新条目,会导致列表出现重复项。修改为:先检查是否已存在对应键的配对,存在则更新值,不存在再添加。
修改ConfigurationHelper的SaveConfiguration方法:
public bool SaveConfiguration(string key, object value, Control control) { try { // 保存配置到Properties.Settings Properties.Settings.Default[key] = value; Properties.Settings.Default.Save(); // 检查列表中是否已有该键的配对 var existingPair = settingControlPairs.FirstOrDefault(p => p.Key == key); if (existingPair != null) { // 更新已有配对的值 existingPair.Value = value; } else { // 不存在则添加新配对 settingControlPairs.Add(new SettingControlPair { Key = key, Value = value, Control = control }); } return true; } catch (Exception ex) { Console.WriteLine("保存配置出错: " + ex.Message); return false; } }
3. 优化加载逻辑,添加默认值处理(可选)
如果是程序第一次运行,Properties.Settings中可能没有对应键的配置,此时可以设置默认值并保存,确保控件显示合理的初始值。
修改ConfigurationHelper的LoadConfiguration方法:
public void LoadConfiguration() { foreach (var pair in settingControlPairs) { object value = Properties.Settings.Default[pair.Key]; // 若配置不存在,设置对应默认值 if (value == null) { switch (pair.Key) { case "LensSize": value = 10; break; // 其他配置项的默认值在这里添加 // case "AutoCropEnabled": // value = false; // break; } // 保存默认值到配置文件 if (value != null) { Properties.Settings.Default[pair.Key] = value; Properties.Settings.Default.Save(); } } if (value != null) { pair.Value = value; // 根据控件类型赋值 if (pair.Control is TextBox textBox) { textBox.Text = value.ToString(); } else if (pair.Control is CheckBox checkBox) { if (bool.TryParse(value.ToString(), out bool isChecked)) { checkBox.Checked = isChecked; } } else if (pair.Control is NumericUpDown numericUpDown) { if (decimal.TryParse(value.ToString(), out decimal numericValue)) { numericUpDown.Value = numericValue; } } else if (pair.Control is ComboBox comboBox) { comboBox.SelectedItem = value; } else if (pair.Control is TrackBar trackBar) { if (int.TryParse(value.ToString(), out int trackBarValue)) { trackBar.Value = trackBarValue; } } } } }
内容的提问来源于stack exchange,提问作者Daniel Lip
相关产品推荐
相关产品推荐

