如何使用textBox1在treeView1中搜索项目中的单词/字符串?

时间:2014-07-28 16:38:39

标签: c# .net winforms

我有一个带有treeView1和textBox1的新表单。

我希望当我在textBox1中输入一个单词时,如果它与任何节点中的任何项目中的单词匹配,则会突出显示该单词。

例如,如果我在textBox1中键入hello,它将找到所有存在的地方。

但如果我只键入h或者他不应该突出显示单词hello

也许可以为textBox1添加Enter键或点击事件以确认搜索时间。

现在我正在使用textBox1_TextChanged事件,但我不确定这是不是一个好主意。

一般情况下,我想在treeView中搜索所有列表项中的单词。

现在,当我在textBox1中键入一个字母/字符时,它会跳转到treeView1并折叠我不想要的地方。不按我的意愿工作。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ScrollLabelTest
{
    public partial class DisplayResponses : Form
    {
        TreeNode[] treeNodes;
        private List<string> nodesNames = new List<string>();
        private List<TreeNode> CurrentNodeMatches = new List<TreeNode>();
        private int LastNodeIndex = 0;
        private string LastSearchText;

        public DisplayResponses()
        {
            InitializeComponent();

            addmore();
        }

        public void addmore()
        {
            foreach (List<string> l_branch in ListsExtractions.responsers)
            {
                TreeNode l_node = treeView1.Nodes.Add(l_branch[l_branch.Count - 1]);

                for (int l_count = 0; l_count < l_branch.Count - 1; l_count++)
                {
                    l_node.Nodes.Add(l_branch[l_count]);
                }
            }
        }

        private void DisplayResponses_Load(object sender, EventArgs e)
        {

        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            if (textBox1.Text != "")
            {

                foreach (TreeNode tn in treeView1.Nodes)
                {
                    /*if (textBox1.Text == tn.Text)
                    {
                        MessageBox.Show(tn.Text);
                    }*/

                    int positionOfDream = tn.Text.IndexOf(textBox1.Text);
                    if (positionOfDream != -1)
                    {
                        string name = tn.Text.Substring(positionOfDream, textBox1.Text.Length);
                        if (textBox1.Text == tn.Text)
                        {
                            MessageBox.Show(tn.Text);
                        }
                    }
                }
            }
        }
    }
}

在这部分:

if (textBox1.Text == tn.Text)
{
    MessageBox.Show(tn.Text);
}

当我键入节点的完整名称时,它正在显示节点的名称。 现在在这一部分:

int positionOfDream = tn.Text.IndexOf(textBox1.Text);
if (positionOfDream != -1)
{
    string name = tn.Text.Substring(positionOfDream, textBox1.Text.Length);
    if (textBox1.Text == tn.Text)
    {
        MessageBox.Show(tn.Text);
    }
}

我希望如果我键入完整的节点名称,或者如果我键入节点名称的一部分,它将显示它或具有此部分名称的任何其他节点。 例如,如果节点名称是:Hello world

如果我键入Hello,它将显示Hello world以及其他具有Hello内容的节点名称 但是,如果我只键入H,请不要显示名称中带有H的所有节点。

这部分工作后我想添加另一部分当我在textBox1中键入任何字符串而不是一个字母而不是一个字符串例如:Hello 因此,它将搜索所有节点,但不搜索节点的名称,但在每个节点树内搜索。 例如,我有一个节点名称:Hello World 如果我点击&#39; +&#39;在它附近它将崩溃并向我显示70项/子节点。 我想在这个70项/子节点上搜索我在textBox1中键入的字符串。

字符串/单词应该来自三个字母并且打开。如果我键入少于三个字母,则不要在70个项目/子节点中搜索,而是继续搜索上面的节点名称。

2 个答案:

答案 0 :(得分:1)

以下代码将搜索所有节点以进行完全匹配,并突出显示背景为红色:

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        foreach (TreeNode tn in treeView1.Nodes)
        {
            Call(tn); 
        }
    }

    private void Call(TreeNode treeNode)
    {
        if (treeNode.Text == textBox1.Text)
        {
            treeNode.BackColor = Color.Red;
        }
        else
        {
            treeNode.BackColor = Color.White;
        }
        foreach (TreeNode tn in treeNode.Nodes)
        {
            Call(tn);
        }
    }

答案 1 :(得分:0)

部分答案。

&#34;一个字符串/单词应该来自三个字母并打开。&#34; 只有在键入3个字母或更多字母后才能运行

if (textBox1.Text != "")

if (textBox1.TextLength >= 3)
{
   //search child items only
}
else
{
   //search items only
}