2017-04-25 5 views
1

사용자가 다음과 같은 규칙에 따라 색상 코드가있는 텍스트를 입력 할 수있는 RichTextBox가 있습니다.RichTextBox의 텍스트를 효율적으로 색상 코딩

  1. { } () | . (dot) 이러한 문자는 빨간색이어야합니다.
  2. [A-Z] [a-z] [0-9] 밑줄과 하이픈 어두운 회색이어야합니다.
  3. 다른 모든 항목은 파란색이어야합니다.

지금은 상자의 내용이 바뀌면이 코드가 나타납니다. 이 메서드는 텍스트 상자의 내용에서 변경된 내용이있을 때마다 호출됩니다.

public void colorCode() { 
    for (int i = 0 ; i < rtb.Text.Length ; i++) { 
     rtb.Select(i,1); //select a single character 
     char ch = rtb.Text[i]; 
     if (ch == '{' || ch == '}' || 
      ch == '(' || ch == ')' || 
      ch == '.') 
      rtb.SelectionColor = Color.Red; 
     else if (isAlphaNumeric(ch)) 
      rtb.SelectionColor = Color.DarkGrey; 
     else 
      rtb.SelectionColor = Color.Blue; 
    } 
} 

수백 개의 문자가있는 경우 매우 느릴 수 있습니다. 이 상황을 어떻게 개선 할 수 있습니까?

+0

변경 될 때마다 실행하지 않고 업데이트를 대기시킬 수 있습니다. [this] (http://stackoverflow.com/q/15587767/1997232)를 참조하십시오. – Sinatr

+0

@Sinatr 더 정교한 답변을 많이 주시면 감사하겠습니다. –

+1

아마도 [AvalonEdit] (http://avalonedit.net)과 같은 구문 강조를 지원하는 편집기를 사용할 수 있습니다. [documentation] (http://avalonedit.net/documentation/)에서 [자체 규칙 정의 방법]을 찾을 수 있습니다 (http://avalonedit.net/documentation/html/4d4ceb51-154d-43f0-b876-ad9640c5d2d8). .htm). – Oliver

답변

0

변경된 단일 문자 만보고 있으므로 KeyUp 이벤트에서이 작업을 수행 할 수 있습니다. 이것이 훨씬 더 빠를 지 확신하지 못합니다.

private void rtb_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e) 
{ 

    if (e.KeyCode == Keys.OemPeriod 
     rtb.SelectionColor = Color.Red; 
    ... 
    } 
} 
+0

불쾌감은 없지만 답이 아니라는 의견이었을 것입니다. 나는 갈 생각이 없지만 누군가이 대답에 투표 할 수 있습니다. 이제 당신의 해결책에 대해 어떻게 변화가 일어 났는지 정확히 알 수있을 것입니다. 이미 텍스트 상자에있는 콘텐츠 사이에있을 수 있습니다. –

+0

변경 사항에 대한 귀하의 질문을 이해하고 있는지 잘 모르겠습니다. KeyUp 이벤트에는 이전에 입력 한 모든 텍스트를 반복하지 않고 단일 문자가 어떤 색이어야하는지 그 시점에서 평가할 수 있도록 눌려진 키를 알려주는 이벤트 arg가 있습니다. https://msdn.microsoft.com/en-us/library/system.windows.forms.control.keyup(v=vs.110).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet -2 –

+0

이것이'abcdef .. 상자 안의 텍스트라고 가정 해 봅시다. (이제'c '문자 옆에 커서를 놓고'{'를 누르십시오.) 이제 논리에 의해 어떤 키가 눌려 졌는지 알지만 문자열의 어느 위치에 위치하지 않습니까? –