2011-09-01 5 views
3

400 개의 선을 가진 RichTextBox를 고려하고 여러 단어와 선을 색상으로 포함합니다.C에서 나머지 줄의 색을 유지하면서 RichTextBox 선을 제거합니다.

남은 단어의 색은 예약되어 있지만이 텍스트 상자의 처음 100 줄은 제거 할 수 있습니까? 현재 아래 코드를 사용하여 선을 제거하고 있지만 색상을 유지할 수는 없습니다.

if (rtb.Lines.Count() > 400) 
    rtb.Lines = rtb.Lines.Skip(100).ToArray(); 

답변

9

SelectionText 속성을 사용하십시오. 먼저 제거 할 선을 선택한 다음 SelectionText를 빈 문자열로 설정하여 선을 제거하십시오. 이렇게 :

richTextBox1.SelectionStart = 0; 
    richTextBox1.SelectionLength = richTextBox1.GetFirstCharIndexFromLine(200); 
    richTextBox1.SelectedText = ""; 

이렇게하면 다른 모든 줄의 서식이 보존됩니다. 이로 인해 UI에서 눈에 띄는 깜박임이 발생할 수 있으므로 Begin/EndUpdate 메서드를 shown here으로 구현하여이를 방지 할 수 있습니다.

+0

RTF. 명성! – pstrjds

+1

이 솔루션은 richTextBox1.ReadOnly가 false로 설정되어 있으면 작동합니다. 그렇지 않으면 아무것도하지 않습니다. –

1

서식을 유지하려면 Lines 속성을 사용할 수 없습니다. Lines은 TextBoxBase에서 파생됩니다. Rtf 속성을 사용하고 줄 문자열을 직접 파싱해야합니다. 당신은 정확하게 실제 라인을 당겨하는 RTF specification 볼 필요가

// NOTE: I am using Length rather than Count() because the array already knows its length 
if (rtb.Lines.Length > 400) 
{ 
    // Parse the rtf here to remove the unwanted lines and preserve the format 
} 

: 당신은 단지 라인 수를 얻을 후 다음과 같은 일을 할 수있는 RTF를 구문 분석합니다. 줄 바꿈은 \par 태그로 표시됩니다. 처리하기 까다로운 행은 실제 행의 첫 번째 텍스트 앞에 추가 정보가있을 수 있기 때문에 첫 행입니다.

0

그래서 나는 .Lines 속성을 재생하는 것입니다 두 번째 해결책을 발견 .SelectedText = ""내 응용 프로그램에서 Windows 땡을 던져 elegent 및 간단하고 분석하는 것보다 더 나은 방법입니다

if (nbLines > maxLines) 
{ 
    Array.Copy(rtfBox.Lines, 1, 
       rtfBox.Lines, 0, rtfBox.Lines.Length - 1); 
} 
관련 문제