web-dev-qa-db-ja.com

検索したすべての単語を強調表示する

私のRichtextBoxで、私が以下のように書いた場合。

これは私のペンです、
彼のペンは美しいです。

単語「is」を検索すると、出力は次のようになります。

すべての「is」を強調表示する必要があります。

12
Khilen Maniyar

どうですか:

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;
    }
}
19
Omar

これでうまくいくようです。

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;
    }
1
Adam

他のすべての回答はテキストを強調表示しますが、もう一度検索した後は元に戻らないので、そのようにします。

リッチテキスト検索メソッドを使用して、検索する単語の開始インデックスを検索します。

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;
    }

ButtonまたはTextChangeListenerを使用して、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;
        }
}

フリーズや高いメモリ割り当てを避けるために、最小のワード長を設定することを強くお勧めします。

0
Emanuel S

これにより、検索されたすべての条件が同時に表示されます。

使用:1つのテキストボックス(検索するテキストを入力するため)と1つのボタン(検索を実行するため)。

テキストボックス内に検索条件を入力し、検索ボタンを押します。

        // 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
Goodbye
    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
Mojtaba Samadi

これを使用できるWord全体のみを一致させたい場合は、大文字と小文字を区別しないことに注意してください。また、| s\bは、複数形が強調表示されることを意味します。猫は猫と一致しますが、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
Thomas N