26

このような:

TreeNode[] treeNodes = treeView.Nodes.Find(searchString, true);

textしかし、フィールドではなくフィールドで検索したいname

4

4 に答える 4

42

組み込みの方法は知りませんが、LINQ を使用できます

TreeNode[] treeNodes = treeView.Nodes
                                    .Cast<TreeNode>()
                                    .Where(r => r.Text == "yourText")
                                    .ToArray();
于 2012-09-12T12:34:55.567 に答える
28

すべてのツリー ノード (直接の子ノードだけでなく) を検索するには、以下の拡張メソッドを使用できます。

var nodes = treeView1.FlattenTree()
                     .Where(n => n.Text == "sometext")
                     .ToList();

--

public static class SOExtension
{
    public static IEnumerable<TreeNode> FlattenTree(this TreeView tv)
    {
        return FlattenTree(tv.Nodes);
    }

    public static IEnumerable<TreeNode> FlattenTree(this TreeNodeCollection coll)
    {
        return coll.Cast<TreeNode>()
                    .Concat(coll.Cast<TreeNode>()
                                .SelectMany(x => FlattenTree(x.Nodes)));
    }
}
于 2012-09-12T12:45:15.130 に答える
0

私があなたを正しく理解していれば (最後の質問は非常に混乱していました)、次のように find メソッドを自分で記述できます。

public static TreeNode[] Find(this TreeNode motherNode, string findNodeText)
{
    List<TreeNode> nodeList = new List<TreeNode>();
    foreach (TreeNode childNode in motherNode.Nodes)
        if (childNode.Text.Equals(findNodeText, StringComparison.CurrentCulture))
            nodeList.Add(childNode);
    return nodeList.ToArray<TreeNode>();
}

このメソッドは次のように使用できます

TreeView myTreeView = new TreeView();
foreach (TreeNode node in myTreeView.Nodes)
{
    TreeNode[] childNodes = node.Find("Text");
    // Do something...
}

これが役立つことを願っています。

于 2012-09-12T12:42:12.027 に答える
0

次のコードは、検索条件に一致するノードのみを表示します。

次のコードを検索イベントにコピーします

   private void tbxSearch_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Enter)
        {
            trvMenu.BeginUpdate();
            if (tbxSearch.Text.Length > 0)
            {
                for (int i = trvMenu.Nodes.Count;  i > 0  ; i--)
                {
                    NodeFiltering(trvMenu.Nodes[i - 1], tbxSearch.Text);
                }
            }
            trvMenu.EndUpdate();
        }

次に、検索とフィルター関数を作成します

    private bool NodeFiltering(TreeNode Nodo,string Texto)
    {
        bool resultado = false;

        if (Nodo.Nodes.Count == 0)
        {
            if (Nodo.Text.ToUpper().Contains(Texto.ToUpper()))
            {
                resultado = true;
            }
            else
            {
                Nodo.Remove();
            }
        }
        else
        {
            for (int i = Nodo.Nodes.Count; i > 0; i--)
            {
                if (NodeFiltering(Nodo.Nodes[i - 1], Texto))
                    resultado = true;
            }

            if (!resultado)
                Nodo.Remove();
        }

        return resultado;
    }

このコードは、多くのレベルを持つ Treeview メニューを作成するのに非常に適しています。

于 2015-12-28T03:51:59.433 に答える