Вопрос о записи данных в пользовательский раздел? - PullRequest
0 голосов
/ 10 августа 2010

ниже - мой класс благодаря статье, найденной по адресу:

URL: Дерик Уиттакер

Мой код:

public class FavsSection : ConfigurationSection
    {
        public override bool IsReadOnly()
        {
            return base.IsReadOnly();
        }

        public FavsSection() // default Constructor.
        { }

        [ConfigurationProperty("Items", IsRequired=true)]
        public FavouritesCollection FavsItems
        {
            get 
            {
                return (FavouritesCollection)(base ["Items"]);
            }       
        }
    }

    [ConfigurationCollection(typeof(FavouriteElement))]
    public class FavouritesCollection : ConfigurationElementCollection
    {
        protected override ConfigurationElement CreateNewElement()
        {
            return new FavouriteElement();
        }

        protected override object GetElementKey(ConfigurationElement element)
        {
            return ((FavouriteElement)(element)).ItemType;
        }

        public FavouriteElement this[int idx]
        {
            get
            {
                return (FavouriteElement)BaseGet(idx);
            }
        }

        public override bool IsReadOnly()
        {
            return base.IsReadOnly();
        }
    }

    public class FavouriteElement : ConfigurationElement
    {
        [ConfigurationProperty("id", DefaultValue = "", IsKey = true, IsRequired = true)]
        public string ID
        {
            get
            {
                return ((string)(base["id"]));
            }
            set
            {
                base["id"] = value;
            }
        }

        [ConfigurationProperty("path", DefaultValue = "", IsKey = false, IsRequired = false)]
        public string Path
        {
            get
            {
                return ((string)(base["path"]));
            }
            set
            {
                base["path"] = value;
            }
        }
    }

Мой конфигурационный файл:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="FavouritesMenu" type="MyFileExplorer.FavsSection, MyFileExplorer" />
  </configSections>
  <FavouritesMenu>
    <Items>
      <add id="1" path="c:\foo" />
      <add id="2" path="C:\foo1" />
    </Items>
  </FavouritesMenu>
</configuration>

Как видите, я пытаюсь записать данные в свой пользовательский раздел, который называется «Избранное». Я думаю, что у меня есть основная идея, но я не вижу, как сделать следующий шаг ... что-то связано с методом IsReadOnly? Может кто-нибудь, пожалуйста, помогите мне заполнить пробелы? Не стесняйтесь переименовывать вещи, чтобы их было легче читать? Я думал, что сделаю наполовину приличное усилие, прежде чем я попросил о помощи ...

ИССЛЕДОВАНИЯ: StackOverFlow - ЖЕ ВОПРОС!

---------- Потерян из-за комментария Pike65 ... невозможно записать в коллекцию, потому что он настроен только для чтения.

Я предполагаю, что для коллекции необходимо установить значение IsReadOnly false, и для добавления данных в коллекцию требуются некоторые вспомогательные методы? Эта часть для меня немного туманна ...

Спасибо за чтение, Ibrar

1 Ответ

1 голос
/ 11 августа 2010

Я проводил некоторые базовые тесты и, к удивлению «НЕТ» ... все вышеперечисленное действительно работает.Вам просто нужно убедиться, что если вы хотите передать данные в раздел конфигурации, то по умолчанию они доступны только для чтения.Таким образом, вам нужно будет переопределить метод isReadOnly (), чтобы вышеуказанный код работал.

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

UPDATE:

Приведенный выше пример кода, который я вставил, позволяет вам редактировать то, что уже существует в файле конфигурации внутри вашего пользовательского раздела.Для добавления нового элемента, например, такого как:

            FavsSection favconfig = (FavsSection)config.GetSection("FavouritesMenu");

            ToolStripMenuItem menu = (ToolStripMenuItem)returnMenuComponents("favouritesToolStripMenuItem", form);

            ToolStripItemCollection items = menu.DropDownItems;

            for (int i = 0; i < items.Count; i++)
            {
                //favconfig.FavsItems[i].ID = i.ToString();
                //favconfig.FavsItems[i].Path = items[i].Text;

                favconfig.FavsItems[i] = new FavouriteElement()
                {
                    ID = i.ToString(),
                    Path = items[i].Text
                };
            }

Как вы можете видеть выше, я физически добавляю новый объект 'FavouriteElement' в коллекцию, возвращаемую свойством favconfig.FavItems.,Чтобы сделать это, для его поддержки необходимо расширение одного свойства.

public FavouriteElement this[int idx]
{
    get
    {
        return (FavouriteElement)BaseGet(idx);
    }
    set
    {
      base.BaseAdd(value);
    }
}

Для этого индексатора или свойства paramterful, как его называет Джеффри Рихтер, должен быть реализован метод доступа Set, как показано выше вфрагмент кода.Я вставил его сюда, так как это не заняло много времени, и большая часть кода была изменена с использованием шаблона, который я использовал из статьи Дерика Уиттакера.Надеемся, что это позволит другим кодировщикам реализовать нечто подобное.

Другое решение состоит в том, чтобы просто вместо того, чтобы «собирать» коллекцию все время, чтобы «лассировать» вместе все мои «FavouriteElements», вы могли бы реализовать «набор»Accessor для связанной собственности.Я не проверял это, но мне стоит попробовать.

...