关于将数据写入自定义部分的问题?

时间:2010-08-10 17:37:32

标签: c# .net-3.5 configuration app-config

由于以下文章发现,

以下是我的课程。

网址: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>

正如您所看到的,我正在尝试将数据写入名为“收藏夹菜单”的自定义部分。我想我已经掌握了这个想法的基本要点,但我不知道如何进行下一步......有些事情与'IsReadOnly'有关吗?有人可以帮我填空吗?您可以随意重命名以使其更易于阅读吗?在我寻求帮助之前,我想我会做出一半体面的努力......

研究:StackOverFlow - SAME QUESTION!

----------迷失了Pike65的评论...无法写入集合,因为它被设置为只读。

我认为集合需要设置为IsReadOnly为false,并且需要一些辅助方法来将数据添加到集合中?这部分对我来说都是朦胧的......

感谢阅读, Ibrar

1 个答案:

答案 0 :(得分:1)

我一直在做一些基本的测试并且'不'惊讶......上面的确实有效。您只需要确保当您想要将数据传递到配置部分时,默认情况下它们是只读的。因此,您需要覆盖'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
                };
            }

正如您在上面所看到的,我实际上将一个新的'FavouriteElement'对象添加到属性'favconfig.FavItems'返回的集合中。为了做到这一点,需要扩展一个属性以支持这一点。

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

作为'Jeffrey Richter'的这个索引器或参数属性称他们需要在代码片段中实现它的'Set'访问器,如上所示。我已经将它粘贴在这里,因为它没有花很长时间才弄明白,并且大部分代码都是使用我在Derik Whittaker的文章中使用的模板进行更改的。希望这会让其他程序员实现类似的东西。

另一个解决方案是简单地而不是“获取”集合所有'lassoes'在我所有的'FavouriteElements'中,你可以为相关属性实现'set'访问器。我没有测试过这个,但我可能值得一试。