[英]A question about writing data to a custom section?
以下是我的课程,这要归功于在以下位置找到的文章:
网址: 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”方法有什么作用吗? 有人可以帮我填补空白吗? 随意重命名事物以便于阅读? 我以为在寻求帮助之前会付出半点努力...
----------对Pike65的评论迷失了……无法将其写入集合,因为它被设置为只读。
我假设集合需要将IsReadOnly设置为false,并且需要一些辅助方法才能将数据添加到集合中? 这部分对我来说有点朦胧...
感谢您的阅读,易卜拉欣
我一直在进行一些基本测试,并且“不出意外”……以上方法确实有效。 您只需要确保在要将数据传递到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”对象。 为了做到这一点,一个属性需要扩展以支持这一点。
public FavouriteElement this[int idx]
{
get
{
return (FavouriteElement)BaseGet(idx);
}
set
{
base.BaseAdd(value);
}
}
如“杰弗里·里希特”(Jeffrey Richter)所说的此索引器或参数属性,需要像上面的代码片段中所示实现其“设置”访问器。 我将其粘贴在这里,因为花了很长时间才弄清楚,并且大多数代码都是使用Derik Whittaker的文章中使用的模板进行更改的。 希望这将使其他编码人员能够实现类似的功能。
另一个解决方案是在将我的所有“ FavouriteElements”一起“套索”在一起的过程中,而不是简单地“获取”集合,您可以为相关属性实现“设置”访问器。 我没有对此进行测试,但是我可能值得尝试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.