Страницы

Поиск по вопросам

вторник, 21 мая 2019 г.

Программное добавление ключа в App.config

Создал свою секцию в файле конфигов, могу править значения в существующих строках, но не получается удалять и добавлять строки. Мой код:
Сам конфиг:





Файл с классом моей секции:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Configuration;
namespace project { class CircuitsConfigSection : ConfigurationSection { [ConfigurationProperty( "Circuits" )] public CircuitsCollection CircuitItems { get { return ((CircuitsCollection)(base["Circuits"])); } set { base["Circuits"] = value; } } }
[ConfigurationCollection(typeof(CircuitElement))] public class CircuitsCollection : ConfigurationElementCollection { protected override ConfigurationElement CreateNewElement() { return new CircuitElement(); }
protected override object GetElementKey(ConfigurationElement element) { return ((CircuitElement)(element)).CircuitName; }
public CircuitElement this[int idx] { get { return (CircuitElement)BaseGet(idx); } } }
public class CircuitElement : ConfigurationElement {
[ConfigurationProperty("circuitName", DefaultValue = "", IsKey = true, IsRequired = true)] public string CircuitName { get { return ((string)(base["circuitName"])); } set { base["circuitName"] = value; } }
[ConfigurationProperty("connectionStringOut", DefaultValue = "", IsKey = false, IsRequired = false)] public string ConnectionStringOut { get { return ((string)(base["connectionStringOut"])); } set { base["connectionStringOut"] = value; } }
[ConfigurationProperty("connectionStringIn", DefaultValue = "", IsKey = false, IsRequired = false)] public string ConnectionStringIn { get { return ((string)(base["connectionStringIn"])); } set { base["connectionStringIn"] = value; } } } }
Обработчик клика, где я обращаюсь к конфигу, пытаясь его изменить:
private void saveBtn_Click(object sender, EventArgs e) { Configuration cfg = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); CircuitsConfigSection section = (CircuitsConfigSection)cfg.Sections["CircuitsSection"]; if (section != null) { for (int i = 0; i < circuitSettings.Count; i++) { section.CircuitItems[i].CircuitName = circuitSettings[i].Name; section.CircuitItems[i].ConnectionStringOut = circuitSettings[i].GetConnString(true); section.CircuitItems[i].ConnectionStringIn = circuitSettings[i].GetConnString(false); } cfg.Save(); ConfigurationManager.RefreshSection("CircuitsSection"); } else System.Diagnostics.Debug.WriteLine("Секция не найдена"); this.Close();
}
Понятное дело, что если в circuitSettings хранится больше объектов, чем уже есть в конфиге (section.CircuitItems), то будет вылет за пределы диапазона в счетчике. Но беда в том, что нельзя задать что-то вроде
section.CircuitItems.add(new Item())
Как быть? Как задать больше или меньше существующих элементов? Или вообще отдельно сформированный список присвоить? Сейчас я не вижу доступных команд на изменение длинны списка ключей.


Ответ

Так добавьте нужный метод в CircuitsCollection
public void Add(CircuitElement element) { BaseAdd(element); }

Комментариев нет:

Отправить комментарий