1

Win フォーム アプリケーションでボタンをクリックしたときに、カスタム プロパティが重複しているカスタム TreeNode をクリーンアップしたいと考えています。

たとえば、次のような TreeNodes があります。

public class CustomFruitCrateNode : System.Windows.Forms.TreeNode
{
    public string FruitName { get; set; }
    public bool EatAble{ get; set; }
}

今、ツリービューをクリーンアップして、同じ FruitName を持つすべての重複ノードを削除し、1 つだけを保持したいと考えています。

4

2 に答える 2

3

あなたはそれを2つのステップで行うことができます。最初のステップ - TreeView からすべてのノードのリストを取得します。つまり、TreeView を平坦化します。

private IEnumerable<TreeNode> Flatten(TreeView treeView)
{
    Queue<TreeNode> nodes = new Queue<TreeNode>();
    foreach (TreeNode node in treeView.Nodes)
        nodes.Enqueue(node);

    while (nodes.Any())
    {
        var current = nodes.Dequeue();
        foreach (TreeNode subNode in current.Nodes)
            nodes.Enqueue(subNode);
        yield return current;
    }
}

そして 2 番目のステップ - ノードをグループ化し、各グループから最初のノードを除くすべてのノードを削除します。

Flatten(treeView1)
    .Cast<CustomFruitCrateNode>()
    .GroupBy(n => n.FruitName)
    .SelectMany(g => g.Skip(1))
    .ToList()
    .ForEach(n => n.Remove());
于 2013-11-05T15:29:07.593 に答える
0

これは私がその時やったことです、

 private void bCleanUpTreeView_Click(object sender, EventArgs e)
    {
        Dictionary<string, string> vDic = new Dictionary<string, string>();

        foreach (CustomFruitCrateNode node in treeView1.Nodes)
        {
            foreach (CustomFruitCrateNode childNode in node.Nodes)
            {
                if (!vDic.ContainsKey(childNode.FruitName))
                {
                    vdDic.Add(childNode.Location, childNode.FruitName);
                }
                else
                {
                    childNode.Remove();
                }
            }
        }
    }
于 2013-11-05T15:32:12.247 に答える