Страницы

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

среда, 4 марта 2020 г.

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

#c_sharp #visual_studio


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

Сам конфиг:





   
Файл с классом моей секции: 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()) Как быть? Как задать больше или меньше существующих элементов? Или вообще отдельно сформированный список присвоить? Сейчас я не вижу доступных команд на изменение длинны списка ключей.


Ответы

Ответ 1



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

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

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