0


0

カスタムセクションへのデータの書き込みに関する質問

以下にある記事のおかげで私のクラスは次のとおりです。

URL:http://devlicio.us/blogs/derik_whittaker/archive/2006/11/13/app-config-and-custom-configuration-sections.aspx[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;
            }
        }
    }

私の設定ファイル:


ご覧のとおり、「お気に入りメニュー」というカスタムセクションにデータを書き込もうとしています。 私はアイデアの基本的な要点を持っていると思うが、私はわからない;私の次のステップを作る方法を見ていない…​ 「IsReadOnly」メソッドと何か関係がありますか? 誰かが空白を埋めるのを手伝ってもらえますか? 読みやすくするために、名前を自由に変更してください。 私は助けを求める前に半分まともな努力をすると思った…​

研究:https://stackoverflow.com/questions/2502091/writing-custom-sections-into-app-config[StackOverFlow - 同じ質問!]

_---------- Pike65のコメントで迷子になりました…​ コレクションが読み取り専用に設定されているため、コレクションに書き込むことができません。

コレクションはIsReadOnly falseに設定する必要があり、コレクションにデータを追加するにはいくつかのヘルパーメソッドが必要だと思いますか? この部分はすべて私にとって少しかすんでいます…​

読んでくれてありがとう、Ibrar

1 Answer


1


私はいくつかの基本的なテストを行ってきましたが、驚くことはありません…​ 上記は実際に機能します。 configセクションにデータを渡したい場合、デフォルトではそれらが読み取り専用であることを確認する必要があります。 したがって、上記のコードが機能するためには、「isReadOnly()」メソッドをオーバーライドする必要があります。

解決策は、上記のコードが機能するということです…​ 追加のメソッドをオーバーライドするだけで、要素データを保持するコレクションにアクセスし、Configuration Elementクラスを継承または継承するクラスで定義したプロパティを介してそのコンテンツを操作できます。

更新:

貼り付けた上記のコードサンプルを使用すると、カスタムセクション内の構成ファイルに既に存在するものを編集できます。 たとえば、次のような新しいアイテムを追加するには:

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

上記のように、プロパティ「favconfig.FavItems」によって返されるコレクションに新しい「FavouriteElement」オブジェクトを物理的に追加しています。 これを行うには、1つのプロパティを拡張してこれをサポートする必要があります。

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

「Jeffrey Richter」と呼ばれるこのインデクサーまたはパラメーター化プロパティは、上記のコードスニペットに示すように「Set」アクセサーを実装する必要があります。 理解するのに時間がかからず、Derik Whittakerの記事で使用したテンプレートを使用してほとんどのコードが変更されているため、ここに貼り付けました。 これにより、他のコーダーが同様の何かを実装できるようになります。

別の解決策は、すべての「FavouriteElements」を「投げかける」コレクションを常に「取得」するのではなく、関連するプロパティの「set」アクセサを実装することです。 これはテストしていませんが、試してみる価値はあります。