- PR -

RichTextBox内の検索・ハイライト表示

1
投稿者投稿内容
rio
会議室デビュー日: 2006/11/08
投稿数: 3
投稿日時: 2006-11-08 14:36
C#初心者です。

リッチテキストボックス内の検索・ハイライト表示について教えてください。

1.ファイル指定
2.リッチテキストボックスに指定ファイルの内容を表示
3.表示内容に対し、指定された単語が含まれていたらその単語部分を赤色表示

という一連の動作をひとつの処理として、リッチテキストボックス内の検索を行おうとしています。

3の部分は下記のコードで一応動作するようになったのですが、指定した文字がファイルの先頭に位置する場合だけ、その時の処理はきちんと動作するのですが、続けてファイル指定->単語検索という別の処理を行うと、リッチテキストボックスに表示される内容が全て赤色で表示されてしまいます。

どうぞご助言の程宜しくお願い致します。

=======================================================

下記がそのコードです:

foreach (String wd in WordsList)
{
  SearchWord(wd);
}

private void HighlightSelectWord(String wd)
{
int startPos;
Boolean endFlg = false;
richTextBox1.SelectionStart = 0;

while (!endFlg)
{
startPos = richTextBox1.Find(wd, richTextBox1.SelectionStart, RichTextBoxFinds.None);

if (startPos < 0)
{
endFlg = true;
}
else{
richTextBox1.SelectionLength = wd.Length;
richTextBox1.SelectionColor = System.Drawing.Color.Red;
richTextBox1.SelectionStart += richTextBox1.SelectionLength;
}
if (richTextBox1.Text.Length <= richTextBox1.SelectionStart)
{
endFlg = true;
}
}
}
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-11-08 14:50
引用:

rioさんの書き込み (2006-11-08 14:36) より:

続けてファイル指定->単語検索という別の処理を行うと、リッチテキストボックスに表示される内容が全て赤色で表示されてしまいます。


これは、ハイライト表示とは "別の処理" なのですか?

だとすれば、その "別の処理" のコードが原因である可能性が高いわけで、
その部分に当たるコードが必要だと思われますが、いかがでしょうか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-11-08 14:54
クロスサイトポスト。情報共有のために、リンクします。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
rio
会議室デビュー日: 2006/11/08
投稿数: 3
投稿日時: 2006-11-08 19:46
じゃんぬねっとさん。

ご返信ありがとうございます。

> これは、ハイライト表示とは "別の処理" なのですか?

すみません。
コードの関数名を修正するのを忘れておりました。
HighlightSelectWord()がSearchWord()となります。
お手数おかけして申し訳ございません。


細かく言うと、
1)ファイル指定
2)検索単語指定
3)ボタン押下
[ボタン押下時の処理開始]
 3-1)指定ファイル読み込み
 3-2) RichTextBoxに読み込んだファイル内容表示
 3-3) RichTextBoxの表示内容を検索して該当単語を赤色表示

という流れで行っており、コードは3-3)の部分に相当します。

private void SearchWord(String wd)
{
 int startPos;
 Boolean endFlg = false;
 richTextBox1.SelectionStart = 0;
 String color = richTextBox1.SelectionColor;
 :

 while (!endFlg)
 {
   :
 }

 String colorAtEnd = richTextBox1.SelectionColor;
}

として、SearchWordが呼ばれた時のSelectionColorの値を確認してみたところ、

a) 検索単語が先頭以外に位置する場合

  fileAを指定して単語"DEF"検索開始
   ↓
  colorの値:Black
   ↓
  検索・ハイライト(赤色)表示[正常終了]
   ↓
  colorAtEndの値:Black
   ↓
  fileBを指定して単語"XYZ"検索開始
   ↓
  colorの値:Black
   ↓
  検索・ハイライト(赤色)表示[正常終了]
   ↓
  colorAtEndの値:Black


b) 検索単語が先頭に位置する場合

  fileAを指定して単語"ABC"検索開始
   ↓
  colorの値:Black
   ↓
  検索・ハイライト(赤色)表示[正常終了]
   ↓
  colorAtEndの値:Black
   ↓
  fileBを指定して単語"XYZ"検索開始
   ↓
  colorの値:Red
   ↓
  全てが赤色表示される

となってしまいます。

colorを確認しているポイントに、
richTextBox1.SelectionColor = System.Drawing.Color.Black;
というコードを追加して見たのですが、現象は改善されませんでした。

また、同じポイントで、richTextBox1.SelectionStart, richTextBox1.SelectionLengthの値も確認してみたのですが、ボタン押下後に初めて呼び出された時点ではどちらも0で始まり問題ないように見えます。

上手く説明できず、長文申し訳ございません。
minminnana
大ベテラン
会議室デビュー日: 2004/02/05
投稿数: 246
お住まい・勤務地: 盛岡
投稿日時: 2006-11-08 21:13
以下のサンプルは参考になりませんか。
指定した文字を検索してハイライト表示する方法
rio
会議室デビュー日: 2006/11/08
投稿数: 3
投稿日時: 2006-11-08 23:26
minminnanaさん

ご返信ありがとうございます。
サンプルの方法、ありがたく参考にさせて頂きました。

不具合ですが、RichTextBoxに読み込みファイルの内容を設定する前に、一度RichTextBox.Textをクリアすることで解決致しました。

3)ボタン押下
[ボタン押下時の処理開始]
 3-1)指定ファイル読み込み
 3-2) RichTextBoxに読み込んだファイル内容表示
 3-3) RichTextBoxの表示内容を検索して該当単語を赤色表示

という流れの処理で、3-2)の時点で、前回のFindによるSelectionの情報が継続していて、3-3)実行前には既にその情報が新たに読み込んだファイルの内容に反映されてしまっていたためこのような現象が起きていたようです(と、一応自分では理解致しました)。

よって、3-2)で

 RichTextBox1.Text = "";  // 追加したコード
 RichTextBox1.Text = FileContent;

とすることでちゃんと動作するようになりました。

お騒がせ致しましてすみませでした。

また、じゃんぬねっとさん、minminnanaさん、ご助言どうもありがとうございました。
行き詰っておりましたので、考え方の転換にもなりとても助かりました。
1

スキルアップ/キャリアアップ(JOB@IT)