Highlight all searched words

后端 未结 6 698
耶瑟儿~
耶瑟儿~ 2020-12-16 00:35

In my RichtextBox, if I have written as below.

This is my pen,
his pen is beautiful.

Now I search word \"is\"

相关标签:
6条回答
  • 2020-12-16 01:04

    Looks like this would do it.

    http://www.dotnetcurry.com/ShowArticle.aspx?ID=146

    int start = 0;
    int indexOfSearchText = 0;
    
        private void btnFind_Click(object sender, EventArgs e)
        {
            int startindex = 0;
    
            if(txtSearch.Text.Length > 0)
                startindex = FindMyText(txtSearch.Text.Trim(), start, rtb.Text.Length);
    
            // If string was found in the RichTextBox, highlight it
            if (startindex >= 0)
            {
                // Set the highlight color as red
                rtb.SelectionColor = Color.Red;
                // Find the end index. End Index = number of characters in textbox
                int endindex = txtSearch.Text.Length;
                // Highlight the search string
                rtb.Select(startindex, endindex);
                // mark the start position after the position of
                // last search string
                start = startindex + endindex;
            }
        }
    
        public int FindMyText(string txtToSearch, int searchStart, int searchEnd)
        {
            // Unselect the previously searched string
            if (searchStart > 0 && searchEnd > 0 && indexOfSearchText >= 0)
            {
                rtb.Undo();
            }
    
            // Set the return value to -1 by default.
            int retVal = -1;
    
            // A valid starting index should be specified.
            // if indexOfSearchText = -1, the end of search
            if (searchStart >= 0 && indexOfSearchText >=0)
            {
                // A valid ending index
                if (searchEnd > searchStart || searchEnd == -1)
                {
                    // Find the position of search string in RichTextBox
                    indexOfSearchText = rtb.Find(txtToSearch, searchStart, searchEnd, RichTextBoxFinds.None);
                    // Determine whether the text was found in richTextBox1.
                    if (indexOfSearchText != -1)
                    {
                        // Return the index to the specified search text.
                        retVal = indexOfSearchText;
                    }
                }
            }
            return retVal;
        }
    
    // Reset the richtextbox when user changes the search string
        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            start = 0;
            indexOfSearchText = 0;
        }
    
    0 讨论(0)
  • 2020-12-16 01:05

    I would do it like that because all the other answers highlight the text, but doesnt change it back after you searched again.

    Use the RichText Find Method to find the starting index for the searching word.

    public int FindMyText(string searchText, int searchStart, int searchEnd)
        {
            int returnValue = -1;
    
            if (searchText.Length > 0 && searchStart >= 0)
            {
                if (searchEnd > searchStart || searchEnd == -1)
                {
                    int indexToText = richTextBox1.Find(searchText, searchStart, searchEnd, RichTextBoxFinds.MatchCase);
                    if (indexToText >= 0)
                    {
                        returnValue = indexToText;
                    }
                }
            }
    
            return returnValue;
        }
    

    Use a Button or TextChangeListener and Search for your word.

    private void button1_Click(object sender, EventArgs e)
    {
            // Select the first char in your Richtextbox
            richTextBox1.SelectionStart = 0;
    
            richTextBox1.SelectionLength = richTextBox1.TextLength;
            // Select until the end
            richTextBox1.SelectionColor = Color.Black;
            // Make the Text Color black
    
            //Use an Inputfield to add the searching word
            var word = txtSearch.Text;
            //verify the minimum length otherwise it may freeze if you dont have text inside
            if (word.Length > 3)
            {
              int s_start = richTextBox1.SelectionStart, startIndex = 0, index;
              while ((index = FindMyText(word, startIndex, richTextBox1.TextLength)) != -1)
                {
                // goes through all possible found words and color them blue (starting index to end)
                    richTextBox1.Select(index, word.Length);
                    richTextBox1.SelectionColor = Color.Blue;
                    startIndex = index + word.Length;
                }
                // Color everything between in color black to highlight only found words       
                richTextBox1.SelectionStart = startIndex;
                richTextBox1.SelectionLength = 0;
                richTextBox1.SelectionColor = Color.Black;
            }
    }
    

    I would highly recommend to set a minimum word length to avoid freezing and high memory allocation.

    0 讨论(0)
  • 2020-12-16 01:09

    If you only want to match the whole word you can use this, note that this ignores case and also the |s\b means that plurals get highlighted e.g. Cat matches cats but not caterpiller :

        public static void HighlightText(RichTextBox myRtb, string word, Color color)
        {
            if (word == string.Empty)
                return;
            var reg = new Regex(@"\b" + word + @"(\b|s\b)",RegexOptions.IgnoreCase);
    
            foreach (Match match in reg.Matches(myRtb.Text))
            {
                myRtb.Select(match.Index, match.Length);
                myRtb.SelectionColor = color;
            }
    
            myRtb.SelectionLength = 0;
            myRtb.SelectionColor = Color.Black;
        }
    
    0 讨论(0)
  • 2020-12-16 01:13

    This will show all the searched criteria at the same time.

    Using: 1 Textbox (to enter the text to search for) and 1 Button (to Run the Search).

    Enter your search criteria inside the textbox and press search button.

            // On Search Button Click: RichTextBox ("rtb") will display all the words inside the document
        private void btn_Search_Click(object sender, EventArgs e)
        {
            try
            {
                if (rtb.Text != string.Empty)
                {// if the ritchtextbox is not empty; highlight the search criteria
                    int index = 0;
                    String temp = rtb.Text;
                    rtb.Text = "";
                    rtb.Text = temp;
                    while (index < rtb.Text.LastIndexOf(txt_Search.Text))
                    {
                        rtb.Find(txt_Search.Text, index, rtb.TextLength, RichTextBoxFinds.None);
                        rtb.SelectionBackColor = Color.Yellow;
                        index = rtb.Text.IndexOf(txt_Search.Text, index) + 1;
                        rtb.Select();
                    }
                }
            }
    
            catch (Exception ex) { MessageBox.Show(ex.Message, "Error"); }
        }
    }
    

    }

    0 讨论(0)
  • 2020-12-16 01:14
        private void button3_Click(object sender, EventArgs e)
        {
            if (textBox1.Text != "")
            {
                for (int i = 0; i < richTextBox1.TextLength; i++)
                {
                    richTextBox1.Find(textBox1.Text, i, RichTextBoxFinds.None);
                    richTextBox1.SelectionBackColor = Color.Red;
                }
            }
            else
            {
                for (int i = 0; i < richTextBox1.TextLength; i++)
                {
                    richTextBox1.SelectAll();
                    richTextBox1.SelectionBackColor = Color.White;
                }
            }
        }[lets make it!][1]
    
    0 讨论(0)
  • 2020-12-16 01:17

    What about:

    static class Utility {
        public static void HighlightText(this RichTextBox myRtb, string word, Color color) {  
    
           if (word == string.Empty)
                return;
    
           int s_start = myRtb.SelectionStart, startIndex = 0, index;
    
           while((index = myRtb.Text.IndexOf(word, startIndex)) != -1) {
               myRtb.Select(index, word.Length);
               myRtb.SelectionColor = color;
    
               startIndex = index + word.Length;
           }
    
           myRtb.SelectionStart = s_start;
           myRtb.SelectionLength = 0;
           myRtb.SelectionColor = Color.Black;
        }
    }
    
    0 讨论(0)
提交回复
热议问题