Winforms 在winform中公开对象以进行编辑的最佳方法?

Winforms 在winform中公开对象以进行编辑的最佳方法?,winforms,clr,Winforms,Clr,我有一个来自反序列化XML的对象。 我想将其可视化,并使其在UI中可编辑。 这在一开始似乎很容易,但随着我深入研究,它变得越来越混乱 我的第一种方法是使用拆分面板: -左边是一个树景。 -右侧是一个列表视图,显示在树视图中选择的值/对象 问题是我不知道如何将列表和树与对象链接起来。 我通过遍历对象中的每个元素来填充树视图 编辑:是否可以在CLR中实现。除此之外,我还需要使用一些C++代码。所以你有一个树视图对象,它显示树型,其中每个树型显示一个Syt.xML.xMLNo结。每个TreeNode的

我有一个来自反序列化XML的对象。 我想将其可视化,并使其在UI中可编辑。 这在一开始似乎很容易,但随着我深入研究,它变得越来越混乱

我的第一种方法是使用拆分面板: -左边是一个树景。 -右侧是一个列表视图,显示在树视图中选择的值/对象

问题是我不知道如何将列表和树与对象链接起来。 我通过遍历对象中的每个元素来填充树视图


编辑:是否可以在CLR中实现。除此之外,我还需要使用一些C++代码。

所以你有一个树视图对象,它显示树型,其中每个树型显示一个Syt.xML.xMLNo结。每个TreeNode的子节点与XmlNode的子节点相对应

您必须决定为XmlNode显示什么文本,但这是一个小问题

class XmlTreeNode : System.Windows.Forms.TreeNode
{
     public XmlTreeNode(System.Xml.XmlNode xmlNode) : base()
     {
         this.XmlNode = xmlNode;
         string textToDisplay = xmlNode.ToDisplayText();
         this.Text = textToDisplay;

         foreach (var childXmlNode in xmlNode.xmlNodeList.Cast<XmlNode>())
         {
              XmlTreeNode childNode = new XmlTreeNode(childXmlNode);
              this.Nodes.Add(childNode);
         }
    }
    public XmlNode XmlNode {get; private set;}
}
当然,您希望能够在XmlTreeNodeView中显示这些XmlTreeNodes:

class XmlTreeNodeView : System.Windows.Forms.TreeView
{
     // default constructor: constructs empty XmlTreeNodeView:
     public XmlTreeNodeView() : base() {}

     // constructor fills the XmlTreeNodeView with the XmlNodes:
     public XmlTreeNodeView(IEnumerable<XmlNode> xmlNodes) : base()
     {
         foreach (XmlNode xmlNode in xmlNodes)
         {
             this.Nodes.Add(new XmlTreeNode(xmlNode));
     }
}
在XmlTreeView类中:

public event EventHandler<XmlTreeNodeEventArgs> XmlNodeClicked;

protected virtual void OnXmlNodeClicked(XmlNode node)
{
    return XmlNodeClicked?.Invoke(new XmlTreeNodeEventArgs() {XmlNode = node});
}

protected override void OnAfterSelect (System.Windows.Forms.TreeViewEventArgs e)
{
    // get the XmlTreeNode that was clicked:
    XmlTreeNode node = (XmlTreeNode)e.Node;
    this.OnXmlNodeClicked(node);        
}
好的方面是,为了在XmlTreeView中获得除XmlNodes之外的其他内容,您必须做一些非常愚蠢的事情


如果您确实希望防止添加与XmlNode不同的内容,那么XmlTreeView不应该从TreeView继承,而应该从UserControl继承。UserControl应该在其中显示一个树视图。尽管此方法有效,但您必须复制所有要公开的TreeView功能。我不确定额外的工作是否与XmlTreeView仅包含XmlTreeNodes的额外安全性成本相称。

我不知道是否需要使用Winforms,但我建议一般使用WPF,尤其是在本用例中。当遵循此建议时,搜索主详细场景//编辑:或者从这个例子开始:你能比“对象”更具体吗?什么是XML,您希望可视化和编辑什么?你的用户界面是什么?“将列表和树和对象链接起来”是什么意思?为什么你认为这会有帮助?谢谢Harald。这是一个非常完整的答案,我相信你花了一些时间,所以我会尝试检查它。但我编辑了我的问题,注意到我需要在CLR中这样做,我不太习惯这样做,所以我将尝试调整您的代码以适应它,并返回一些反馈。
public class XmlTreeNodeEventArgs : EventArgs
{
    public XmlNode XmlNode {get; set;}
}
public event EventHandler<XmlTreeNodeEventArgs> XmlNodeClicked;

protected virtual void OnXmlNodeClicked(XmlNode node)
{
    return XmlNodeClicked?.Invoke(new XmlTreeNodeEventArgs() {XmlNode = node});
}

protected override void OnAfterSelect (System.Windows.Forms.TreeViewEventArgs e)
{
    // get the XmlTreeNode that was clicked:
    XmlTreeNode node = (XmlTreeNode)e.Node;
    this.OnXmlNodeClicked(node);        
}