52053


**概要**  
リッチテキストボックスにおいて、文字の色分けを維持しつつ不要文字を削除したい。

**内容詳細**  
リッチテキストボックス（System.Windows.Forms.RichTextBox）についてご質問があります。  
検索して調べてた所、文字削除の方法として（例えばリッチテキストボックス「richTextBox_Display」の先頭100文字削除する場合）

[code]

    richTextBox_Display.Text = richTextBox_Display.Text.Remove(0, 100)
    
[/code]

という風にするのが定石の様ですが、この方法を行った場合、リッチテキストボックス内で（SelectionColorで）文字の色変えしていた所が全て黒に変わりました。  
（おそらくTextへの代入のみで色情報が渡されていないせい？ 何らかの方法で部分削除済みテキストの色情報を渡す必要がある？）  
文字の色情報を維持したまま削除したいのですが良い方法はありますでしょうか。

下記は実際に上記の動作となった関数です。  
（削除条件の文字数が300と小さいのはデバッグ用に小さな値にしてある為です）

[code]

    private void DisplayText(Color DispColor, String SetText)
    {
    　//追加文字の色を指定色に変更
    　richTextBox_Display.Select(richTextBox_Display.Text.Length, 0);
    　richTextBox_Display.SelectionColor = DispColor;
    　richTextBox_Display.AppendText(SetText + System.Environment.NewLine);
    
    　//文字数が上限の場合、削除
    　if(richTextBox_Display.Text.Length > 300)
    　{
    　　//先頭の100文字削除
    　　richTextBox_Display.Text = richTextBox_Display.Text.Remove(0, 100);
    　}
    }
    
[/code]


CC BY-SA 4.0
2019-01-17T07:06:31.687
52049
2019-01-17T08:47:46.343
2019-01-17T08:47:46.343
9820
30326
question
c# winforms
リッチテキストボックスの文字削除について


RichTextBoxのTextプロパティを置き換えることで、色情報もクリアされることが原因です。  
下記のように部分的に選択して削除することで色情報が失われずに済みます。

[code]

    //先頭の100文字削除
    var selStart = richTextBox_Display.SelectionStart;
    var selLength = richTextBox_Display.SelectionLength;
    richTextBox_Display.SelectionStart = 0;
    richTextBox_Display.SelectionLength = 100;
    richTextBox_Display.SelectedText = "";
    //選択状態を保持する必要がなければ下記のコードは不要
    richTextBox_Display.SelectionStart = selStart;
    richTextBox_Display.SelectionLength = selLength;
    richTextBox_Display.Focus();
    
[/code]

RichTextBoxの[Rtfプロパティ](https://docs.microsoft.com/ja-
jp/dotnet/api/system.windows.forms.richtextbox.rtf?view=netframework-4.7.2#System_Windows_Forms_RichTextBox_Rtf)は文字列と色情報を保持していますので、これを直接編集することで色情報を失わずにテキストを編集することも不可能ではありません。

ただし、"Hello world!"のworldを赤くした時のRtfは下記のようになります。  
[SOの回答](https://stackoverflow.com/a/12384177)には自力でRtfを書き換える例もありますが、あまりお勧めできません。

[code]

    {\rtf1\ansi\ansicpg932\deff0\deflang1033\deflangfe1041{\fonttbl{\f0\fnil\fcharset128 MS UI Gothic;}}
    {\colortbl ;\red255\green0\blue0;}
    \viewkind4\uc1\pard\lang1041\f0\fs18 Hello \cf1 world\cf0 !\par
    }
    
[/code]

FYI: 色情報を失わず、RichTextBoxの **末尾に文字列を追加**
するだけならば[AppendText](https://docs.microsoft.com/ja-
jp/dotnet/api/system.windows.forms.textboxbase.appendtext?view=netframework-4.7.2#System_Windows_Forms_TextBoxBase_AppendText_System_String_)メソッドが用意されています。  
もちろん今回の質問には適しません。


CC BY-SA 4.0
2019-01-17T08:36:41.760
52053
2019-01-17T08:36:41.760
9820
52049
answer