2010-08-10 6 views
0

ci-dessous est ma classe grâce à l'article trouvé à:Une question sur l'écriture de données dans une section personnalisée?

URL: Derik Whittaker

Mon code:

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; 
      } 
     } 
    } 

Mon fichier de configuration:

<?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> 

Comme vous pouvez voir que j'essaie d'écrire des données dans ma section personnalisée appelée "Menu Favoris". Je pense que j'ai compris l'essentiel de l'idée, mais je ne vois pas comment faire ma prochaine étape ... quelque chose a été fait avec la méthode 'IsReadOnly'? Quelqu'un peut-il m'aider s'il vous plaît à remplir les blancs? Sentez-vous libre de renommer les choses pour le rendre plus facile à lire? Je pensais que je ferais un effort demi décent avant que je demande de l'aide ...

RECHERCHE: StackOverFlow - SAME QUESTION!

---------- Got a perdu sur le commentaire de Pike65 ... ne peut pas écrire dans la collection car il est en lecture seule.

Je suppose que la collection doit être définie sur IsReadOnly false et que certaines méthodes auxiliaires sont nécessaires pour ajouter des données dans la collection? Cette partie est brumeux alittle pour moi ...

Merci pour la lecture, Ibrar

Répondre

1

Je fais quelques tests de base et « NON » surprise ... ce qui précède fonctionne réellement. Vous devez juste vous assurer que lorsque vous voulez transmettre des données à votre section de configuration, elles sont en lecture seule par défaut. Vous devrez donc remplacer la méthode 'isReadOnly()' pour que le code ci-dessus fonctionne. Donc la solution est que le code de code ci-dessus fonctionne ... il vous suffit de surcharger une méthode supplémentaire pour accéder à la collection chargée de conserver les données de votre élément et de manipuler son contenu via les propriétés que vous définissez dans la classe qui s'étend ou hérite de la classe Element de configuration.

MISE À JOUR:

L'exemple de code ci-dessus, je collais en vous permet de modifier ce qui existe déjà dans le fichier de configuration dans votre section personnalisée. Pour ajouter un nouvel élément par exemple comme ce qui suit:

  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 
       }; 
      } 

Comme vous pouvez le voir ci-dessus, je suis d'ajouter physiquement un nouvel objet « FavouriteElement » dans la collection retournée par la propriété « favconfig.FavItems ». Pour ce faire, une propriété doit s'étendre pour soutenir cela.

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

Ce indexeur ou d'un bien paramterful comme accesseur « Jeffrey Richter » les appelle doit avoir son « Set » mis en œuvre comme indiqué ci-dessus dans l'extrait de code. Je l'ai collé ici car il n'a pas fallu longtemps pour comprendre et la plupart du code est changé en utilisant un modèle que j'ai utilisé de l'article de Derik Whittaker. Espérons que cela permettra à d'autres codeurs de mettre en œuvre quelque chose de similaire.Une autre solution serait simplement de ne pas 'obtenir' la collection tout le temps que 'lassoes' ensemble tous mes 'FavouriteElements', vous pouvez implémenter l'accesseur 'set' pour la propriété associée. Je n'ai pas testé cela mais je pourrais être utile d'essayer.

Questions connexes