使用C#winforms应用程序中的文本框过滤树视图

nch*_*che 11 c# treeview filter winforms

我在C#winform中有一个TreeView.我希望能够通过搜索框添加搜索功能.基本上当用户输入字母时(我猜_TextChanged事件),我只显示包含带有输入字母的子节点的节点...

我的TreeView包含53个父节点,总共超过15000个节点,因此我需要一些高性能的东西.我从一个csv构建我的TreeView,我将其加载到DataTable中,然后进行查询以获取具有关联子节点的Parent节点...

UPDATE

我有个主意.最终目标是当用户双击子节点时,它会被添加到listView中.

我首先在一个简单的列表视图中实现了这个搜索功能,我没有将我的数据分成几类.

我的想法是,一旦用户开始输入内容,我就会关闭我的树视图并显示列表视图......

我会尝试并实施,看看它给出了明智的表现......任何关于这个想法的评论家都是受欢迎的.

nch*_*che 9

最后这就是我所做的,它符合我的要求.我首先制作TreeView的副本并存储到fieldsTreeCache中.然后我清除了字段树.然后,我搜索缓存并将包含我的搜索参数的任何节点添加到fieldsTree.请注意,一旦搜索,您将不再拥有显示的父节点.你只需要获得所有的终端节点.我这样做是因为如果没有,我有两个选择:

  • 展开包含匹配的子节点的所有父节点,但之后它很慢,并且一个父节点可能有50个子节点在视觉上不是很好.
  • 不扩展父节点,但是您只需获取类别而不是您要搜索的子节点.

    void fieldFilterTxtBx_TextChanged(object sender, EventArgs e)
    {
        //blocks repainting tree till all objects loaded
        this.fieldsTree.BeginUpdate();
        this.fieldsTree.Nodes.Clear();
        if (this.fieldFilterTxtBx.Text != string.Empty)
        {
            foreach (TreeNode _parentNode in _fieldsTreeCache.Nodes)
            {
                foreach (TreeNode _childNode in _parentNode.Nodes)
                {
                    if (_childNode.Text.StartsWith(this.fieldFilterTxtBx.Text))
                    {
                        this.fieldsTree.Nodes.Add((TreeNode)_childNode.Clone());
                    }
                }
            }
        }
        else
        {
            foreach (TreeNode _node in this._fieldsTreeCache.Nodes)
            {
                fieldsTree.Nodes.Add((TreeNode)_node.Clone());
            }
        }
        //enables redrawing tree after all objects have been added
        this.fieldsTree.EndUpdate();
    }
    
    Run Code Online (Sandbox Code Playgroud)

  • _treeTablesCache是​​如何创建的? (7认同)
  • @Thunder 你应该在表单类 `Form.Designer.cs` 中定义它,就像这样的 `private System.Windows.Forms.TreeView _fieldsTreeCache;`。在表单构造函数`this._fieldsTreeCache = new TreeView();` 中启动它,并在您添加或删除节点时填充它。或其他类似“Form_Shown”的地方 (2认同)