gpt4 book ai didi

c# - 如何在属性网格中加载 xml 文档

转载 作者:太空狗 更新时间:2023-10-30 01:10:30 24 4
gpt4 key购买 nike

如何在属性网格中加载xml文档并将xml标签显示为属性网格中的属性

对于上述问题,我在属性网格中得到了答案(通过 Marc Gravell 代码),但是由于可扩展对象转换器,我得到了所有属性的“+”,我需要删除它,如何删除

最佳答案

这不是一个简单的请求;您必须编写一个包装类(用于 XmlNode),它具有自定义 TypeConverter(或者:ICustomTypeDescriptorTypeDescriptionProvider,但 TypeConverter 是最简单的)。然后编写自定义 PropertyDescriptor(或多个)来表示假属性。假设使用 TypeConverter,覆盖 GetProperties 以返回人工属性(对于值或子节点)。

TreeView 向上构建它会更容易...


好的;这并不容易;这是一个非常未经测试的起点点 - 粗糙且几乎没有功能,但无论如何它就在这里。

有关这里发生的事情的更多引用,请特别查看模拟属性的 PropertyDescriptor提供 属性的 TypeConverter(尽管还有其他选择)。

其他一些可能有帮助的文章:

代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms;
using System.Xml;

namespace DemoApp
{
class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();

XmlDocument doc = new XmlDocument();
doc.LoadXml("<xml a=\"b\"><c>d<e f=\"g\">h</e>i</c>j</xml>");
using (var grid = new PropertyGrid { Dock = DockStyle.Fill,
SelectedObject = new XmlNodeWrapper(doc.DocumentElement)})
using (var form = new Form { Controls = {grid}})
{
Application.Run(form);
}
}
}
}
[TypeConverter(typeof(XmlNodeWrapperConverter))]
class XmlNodeWrapper
{
private readonly XmlNode node;
public XmlNodeWrapper(XmlNode node) { this.node = node; }
class XmlNodeWrapperConverter : ExpandableObjectConverter
{
public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, Attribute[] attributes)
{
List<PropertyDescriptor> props = new List<PropertyDescriptor>();
XmlElement el = ((XmlNodeWrapper)value).node as XmlElement;
if (el != null)
{
foreach (XmlAttribute attr in el.Attributes)
{
props.Add(new XmlNodeWrapperPropertyDescriptor(attr));
}
}
foreach (XmlNode child in ((XmlNodeWrapper)value).node.ChildNodes)
{
props.Add(new XmlNodeWrapperPropertyDescriptor(child));
}
return new PropertyDescriptorCollection(props.ToArray(), true);
}
public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
{
return destinationType == typeof(string)
? ((XmlNodeWrapper)value).node.InnerXml
: base.ConvertTo(context, culture, value, destinationType);
}
}
class XmlNodeWrapperPropertyDescriptor : PropertyDescriptor
{
private static readonly Attribute[] nix = new Attribute[0];
private readonly XmlNode node;
public XmlNodeWrapperPropertyDescriptor(XmlNode node) : base(GetName(node), nix)
{
this.node = node;
}
static string GetName(XmlNode node)
{
switch (node.NodeType)
{
case XmlNodeType.Attribute: return "@" + node.Name;
case XmlNodeType.Element: return node.Name;
case XmlNodeType.Comment: return "<!-- -->";
case XmlNodeType.Text: return "(text)";
default: return node.NodeType + ":" + node.Name;
}
}
public override bool ShouldSerializeValue(object component)
{
return false;
}
public override void SetValue(object component, object value)
{
node.Value = (string)value;
}
public override bool CanResetValue(object component)
{
return !IsReadOnly;
}
public override void ResetValue(object component)
{
SetValue(component, "");
}
public override Type PropertyType
{
get {
switch (node.NodeType)
{
case XmlNodeType.Element:
return typeof(XmlNodeWrapper);
default:
return typeof(string);
}
}
}
public override bool IsReadOnly
{
get {
switch (node.NodeType)
{
case XmlNodeType.Attribute:
case XmlNodeType.Text:
return false;
default:
return true;
}
}
}
public override object GetValue(object component)
{
switch (node.NodeType)
{
case XmlNodeType.Element:
return new XmlNodeWrapper(node);
default:
return node.Value;
}
}
public override Type ComponentType
{
get { return typeof(XmlNodeWrapper); }
}
}
}

关于c# - 如何在属性网格中加载 xml 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4591115/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com