2010-08-10 4 views
0

ниже моего класса благодаря статье найдено по адресу:Вопрос о записи данных в пользовательский раздел?

URL: Derik Whittaker

Мой код:

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> 

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

ИССЛЕДОВАНИЕ: StackOverFlow - SAME QUESTION!

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

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

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

ответ

1

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

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

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», вы можете реализовать «набор» для соответствующего свойства. Я не тестировал это, но, возможно, стоит попробовать.

Смежные вопросы