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

271
13 сентября 2017, 10:34

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

Сам конфиг:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
   <section name="CircuitsSection" type="project.CircuitsConfigSection, project"/>
</configSections>
  <startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
<CircuitsSection>
  <Circuits>
    <add circuitName = "Среда разработки" connectionStringOut ="DRIVER={SQL Server};SERVER=sqltest2;UID=123;PWD=123;DATABASE=852;LANGUAGE=русский" connectionStringIn="DRIVER={SQL Server};SERVER=sqltest2;UID=123;PWD=123;DATABASE=852;LANGUAGE=русский"/>
    <add circuitName = "Тестовый" connectionStringOut = "DRIVER={SQL Server};SERVER=sqltest2;UID=123;PWD=123;DATABASE=852;LANGUAGE=русский" connectionStringIn="DRIVER={SQL Server};SERVER=sqltest2;UID=123;PWD=123;DATABASE=852;LANGUAGE=русский"/>
  </Circuits>
</CircuitsSection>
</configuration>

Файл с классом моей секции:

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())

Как быть? Как задать больше или меньше существующих элементов? Или вообще отдельно сформированный список присвоить? Сейчас я не вижу доступных команд на изменение длинны списка ключей.

Answer 1

Так добавьте нужный метод в CircuitsCollection:

public void Add(CircuitElement element)
{
    BaseAdd(element);
}
READ ALSO
В ASP .Net Web Forms создать кнопки передать данные в метод

В ASP .Net Web Forms создать кнопки передать данные в метод

В ASPNet Web Forms пробую создать кнопки и добавить в определенное место, привязать к событию щелчку по ней, передать уникальный индификатор кнопки...

264
закруглить (сгладить) углы в Xamarin

закруглить (сгладить) углы в Xamarin

Подскажите пожалуйста, как закруглить (сгладить) углы у элемента (например TextView) в Xamarin?

317
Javascript. Считать объект из соседнего файла

Javascript. Считать объект из соседнего файла

Имеется файл textjson, лежит в одной папке с index

300
Как добавить свой css для кнопок vkontakte

Как добавить свой css для кнопок vkontakte

Проблема следующаяПодключен виджет "Сообщения сообщества" на сайте

485