如何避免重复的值在TreeView
本文关键字:TreeView 何避免 | 更新日期: 2023-09-27 18:10:26
我正在寻找一种强大而简单的方法来避免在TreeView中重复的值,现在我以这种方式执行插入:
while (rdr.Read())
{
checkExists(rdr.GetString(3));
rootNode.Items.Add(new TreeViewItem() { Header = rdr.GetString(3) });
}
其中RDR是包含所有要递归添加的值的播放器。现在如果这些值已经被添加了,我会得到重复的值,所以我创建了一个函数checkExists你应该检查这个值是否已经在TreeView中。我还没有找到WPF的解决方案,我还在学习如何使用这个控件,我知道怎么做。
public void checkExists(string campionato)
{
foreach (TreeView node in nation_team)
{
if (NodeExists(node, campionato))
exists = true;
}
}
这个方法还没有准备好,它只是一个测试版。
private bool NodeExists(TreeNode node, string key) {
foreach (TreeNode subNode in node.Nodes) {
if (subNode.Text == key) {
return true;
}
if (node.Nodes.Count > 0) {
NodeExists(node, key);
}
}
return false;
}
我尝试过的可能的解决方案,在foreach中,我试图遍历所有节点,但编译器告诉我关于GetEnumerator
如果我理解好你的问题,你的NodeExists
函数不工作。你看,你没有对第二种情况做任何事情,这就是为什么会给你一个错误。另外,您需要检查subNode
一个合适的解决方案是这样的:
private bool NodeExists(TreeNode node, string key)
{
foreach (TreeNode subNode in node.Nodes)
{
if ( subNode.Text.Equals(key) )
{
return true;
}
var nodeChildExists = NodeExists( subNode.Nodes, key );
if(nodeChildExists)
{
return true;
}
}
return false;
}
在摆脱了几乎头敲这个算法,因为它们是新的WPF,特别是我从来没有在TreeView工作过,我做了:
var newHeader = rdr.GetString(3); //it is a reader that contains the current node, for example "Home"
var exists = false;
foreach (TreeViewItem item in rootNode.Items) //iterate through all nodes
{
var header = item.Header;
if (header.Equals(newHeader))
{
Console.WriteLine("Item already inserted!!");
exists = true;
break;
}
}
if (!exists)
{
rootNode.Items.Add(new TreeViewItem() { Header = newHeader });
}
这对我来说很有效,我将保持我的问题开放,以防有人找到比我更好的解决方案,更优化,哦,是的…我是一个疯狂的优化者。如果你能把所有的东西都简化成一行代码,那么……我会的。