C# Windows窗体树视图-绑定分层递归数据源
我正在转换Windows窗体中的WPF客户端,尝试复制TreeView控件结构时遇到一些问题 在第一个项目中,我有一个自定义工厂,它从基本上是XML的输入字符串开始构建结构。 返回类型是一个集合。 自定义树节点:C# Windows窗体树视图-绑定分层递归数据源,c#,winforms,treeview,recursive-datastructures,C#,Winforms,Treeview,Recursive Datastructures,我正在转换Windows窗体中的WPF客户端,尝试复制TreeView控件结构时遇到一些问题 在第一个项目中,我有一个自定义工厂,它从基本上是XML的输入字符串开始构建结构。 返回类型是一个集合。 自定义树节点: public class TreeViewNode { public TreeViewNode() { } public DocumentKey DocKey { get; set; } public string Text { get; set; }
public class TreeViewNode
{
public TreeViewNode() { }
public DocumentKey DocKey { get; set; }
public string Text { get; set; }
public IList<TreeViewNode> Children { get; set; }
}
基本上我是从一个加州大学转到另一个加州大学。它们都是2个选项卡的一部分,是选项卡控件的子项。(由OP以问题编辑的形式回答。转换为社区wiki答案。请参阅)
OP写道:
实际上是我自己弄的。这个想法是将Ricersive的想法结合起来,从树节点集合(IList)中创建一个树节点。问题1:递归问题2:如何维护DocKey自定义属性
那么所有的评论呢?4天过去了,没有人能回答这个问题?我想知道所有的winforms大师都藏在哪里。。。我刚刚对这件事进行了悬赏。为了让你意识到所有可能的答案都需要大量不必要的代码,你真的不应该从21世纪的WPF切换回可怕的winforms石器时代。好的,如果你已经解决了这个问题,要么删除这个问题,要么发布答案。我仍在试图理解为什么会有人从WPF回到winforms…私有TreeNode[]GetTreeViewNodes(IList节点){IList returnedNodes=new List();foreach(节点中的var项){TreeNode=new TreeNode(item.Text,this.GetTreeViewNodes(item.Children));node.Tag=item.DocKey;returnedNodes.Add(node);}returnedNodes.ToArray();}@Highcore您不应该理解或回答“改用WPF”。这个请求很明确,而且是来自客户和项目管理办公室的明确请求……所以我没办法。简单明了。把它作为答案贴出来,然后标记为已回答,这样我也可以结束悬赏。
public class TreeViewFactory
{
public IList<TreeViewNode> GetSctructure(DocumentKey docKey, string structure, bool loadAllParents)
{
XDocument xmlDocstructure = CommonXmlValueParser.GetXDocument(structure);
var parentsNodes = (from item in xmlDocstructure.Descendants("structure_item")
where (CommonXmlValueParser.GetAttribute(item, "level") == "1")
select new TreeViewNode
{
Text = GetNodeText(item),
DocKey = new DocumentKey()
{
Bank = docKey.Bank,
Ud = int.Parse(CommonXmlValueParser.GetElement(item.Element("ud"))),
Master = int.Parse(CommonXmlValueParser.GetElement(item.Element("master"))),
NVig = int.Parse(CommonXmlValueParser.GetElement(item.Element("nvig"))),
Subjects = docKey.Subjects
},
Children = GetChildrenNodes(item, 2, docKey.Bank)
}).ToList();
return parentsNodes;
}
private IList<TreeViewNode> GetChildrenNodes(XElement element, int level, int dataBank)
{
var childrenNodes = (from item in element.Descendants("structure_item")
where (CommonXmlValueParser.GetAttribute(item, "level") == level.ToString())
select new TreeViewNode
{
Text = GetNodeText(item),
DocKey = new DocumentKey()
{
Bank = dataBank,
Ud = int.Parse(CommonXmlValueParser.GetElement(item.Element("ud"))),
Master = int.Parse(CommonXmlValueParser.GetElement(item.Element("master"))),
NVig = int.Parse(CommonXmlValueParser.GetElement(item.Element("nvig"))),
},
Children = GetChildrenNodes(item, level + 1, dataBank)
}).ToList();
return childrenNodes;
}
}
void CreateTree(object tree, EventArgs e)
{
//...
TreeViewFactory treeFactory = new TreeViewFactory();
var documentStructure = treeFactory.Structure(document.DocumentKey, document.XmlStructure, true);
this.tabMainControl.document.SetTreeViewStructureNodes(documentStructure);
}
public void SetTreeViewStructureNodes(IList<TreeViewNode> nodes)
{
this.treeView.ItemsSource = nodes;
}
private TreeView SetTreeViewStructureNodes(IList<TreeViewNode> nodes)
{
TreeView treeView = new TreeView();
treeView.Nodes.AddRange(nodes.ToArray());
return treeView;
}
TreeView treeView = (TreeView)documentViewControl.Controls["treeViewStructure"];
TreeViewFactory treeFactory = new TreeViewFactory();
var documentStructure = treeFactory.GetStructure(document.DocumentKey, document.XmlStructure, true);
treeView = this.SetTreeViewStructureNodes(documentStructure);
private TreeNode[] GetTreeViewNodes(IList<TreeViewNode> nodes)
{
IList<TreeNode> returnedNodes = new List<TreeNode>();
foreach (var item in nodes)
{
TreeNode node = new TreeNode(item.Text, this.GetTreeViewNodes(item.Children));
node.Tag = item.DocKey;
returnedNodes.Add(node);
}
return returnedNodes.ToArray();
}
this.treeView.Nodes.Clear();
this.treeView.Nodes.AddRange(this.GetTreeViewNodes(documentStructure));