【问题标题】:A question about writing data to a custom section?关于将数据写入自定义部分的问题?
【发布时间】:2010-08-11 22:40:09
【问题描述】:

以下是我的课程,感谢以下文章:

网址: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 并且需要一些辅助方法来将数据添加到集合中?这部分对我来说有点朦胧......

感谢阅读, 伊布拉尔

【问题讨论】:

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


    【解决方案1】:

    我一直在做一些基本的测试并且“不”感到惊讶......以上确实有效。您只需要确保当您想要将数据传递到您的配置部分时,默认情况下它们是只读的。因此,您需要重写 'isReadOnly()' 方法才能使上述代码正常工作。

    所以解决方案是上面的代码,确实有效......您只需要覆盖一个额外的方法,以允许您访问负责保存元素数据的集合并通过您定义的属性操作其内容从配置元素类扩展或继承的类。

    更新:

    我粘贴的上述代码示例允许您编辑自定义部分中配置文件中已存在的内容。为了添加一个新项目,例如如下:

                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”所称的这个索引器或参数属性需要在上面的代码 sn-p 中实现它的“Set”访问器。我已经将它粘贴到这里,因为它很快就弄清楚了,并且大部分代码都使用我在 Derik Whittaker 的文章中使用的模板进行了更改。希望这将允许其他编码人员实现类似的东西。

    另一个解决方案是简单地而不是一直“获取”集合,将我所有的“FavouriteElements”“套索”在一起,您可以为相关属性实现“set”访问器。我尚未对此进行测试,但我可能值得一试。

    【讨论】:

      猜你喜欢
      • 2011-01-30
      • 1970-01-01
      • 2012-05-22
      • 2012-04-05
      • 1970-01-01
      • 2016-05-23
      • 2022-06-11
      • 2022-01-07
      • 2011-05-25
      相关资源
      最近更新 更多