C# 关于将数据写入自定义节的问题?
以下是我的课堂,感谢在以下网站上找到的文章: 网址: 我的代码:C# 关于将数据写入自定义节的问题?,c#,.net-3.5,configuration,app-config,C#,.net 3.5,Configuration,App Config,以下是我的课堂,感谢在以下网站上找到的文章: 网址: 我的代码: public class FavsSection : ConfigurationSection { public override bool IsReadOnly() { return base.IsReadOnly(); } public FavsSection() // default Constructor. {
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>
----------在Pike65的评论中迷失了方向。。。无法写入集合,因为它被设置为只读
我假设集合需要设置为IsReadOnly false,并且需要一些助手方法将数据添加到集合中?这部分对我来说有点模糊
谢谢你的阅读,
Ibrar我一直在做一些基本的测试,不出意料。。。上述方法实际上是有效的。您只需要确保当您想要将数据传递到配置部分时,默认情况下它们是只读的。因此,您需要重写“isReadOnly()”方法才能使上述代码正常工作
所以解决办法是,上面的代码行得通。。。您只需要重写一个额外的方法,以允许您访问负责保存元素数据的集合,并通过在扩展或继承自配置元素类的类中定义的属性来操作其内容
更新:
<?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>
我粘贴的上述代码示例允许您编辑自定义节中配置文件中已经存在的内容。要添加新项目,例如,如下所示:
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
};
}
“Jeffrey Richter”调用的索引器或参数属性需要实现其“Set”访问器,如代码段中所示。我把它粘贴在这里,因为它没有花很长时间就弄清楚了,而且大部分代码都是使用我从Derik Whittaker的文章中使用的模板更改的。希望这将有助于其他编码器实现类似的功能
另一个解决方案是,您可以为相关属性实现“set”访问器,而不是一直“获取”集合,将所有“FavoriteElements”捆绑在一起。我还没有测试过这个,但我可能值得一试