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