RichTextBox에서 문자열을 선택적으로 밑줄을 긋는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/821347

  •  03-07-2019
  •  | 
  •  

문제

내 프로그램에서 버튼을 클릭 한 후 선택된 ListView 항목은 RichTextBox에 복사되어야합니다. ListView에는 연락처 정보가 포함되어 있으며, 내가 달성하고자하는 효과는 Oultook (연락처에서 연락처를 선택할 때)과 유사합니다. 이 목적을 제공하는 내 코드의 일부는 다음과 같습니다.

    private void toButton_Click(object sender, EventArgs e)
    {
        int start = 0;
        for (int i = 0; i < contactsListView.SelectedItems.Count; i++)
        {
            if (contactsTextBox.TextLength != 0) contactsTextBox.Text += "; ";
            start = contactsTextBox.TextLength;
            contactsTextBox.Text += contactsListView.SelectedItems[i].Text + " " + contactsListView.SelectedItems[i].SubItems[1].Text + " [" + contactsListView.SelectedItems[i].SubItems[2].Text + "]";
            contactsTextBox.Select(start, contactsTextBox.TextLength);       
            contactsTextBox.SelectionFont = new Font(contactsTextBox.SelectionFont, FontStyle.Underline);
            contactsTextBox.DeselectAll();
            contactsTextBox.SelectionFont = new Font(contactsTextBox.SelectionFont, FontStyle.Regular);
        }
    }

불행히도 어떻게 든 FontStyle은 전체 텍스트에 의해 상속되며 ListView에서 입력 한 후 입력 한 모든 것도 밑줄이 그어집니다.

그래서 내 질문은 - 특정 텍스트 만 강조하는 방법입니다 (내가 실수 한 곳)?

stackoverflow에 비슷한 주제가 있습니다 여기 불행히도 내 경우 솔루션은 자원 낭비가있을 것이라고 밝혔다.

도움이 되었습니까?

해결책

대신 시도해보십시오.

        int start = 0;
        for (int i = 0; i < contactsListView.SelectedItems.Count; i++)
        {
            if (contactsTextBox.TextLength != 0) contactsTextBox.Text += "; ";
            start = contactsTextBox.TextLength;
            contactsTextBox.Text += contactsListView.SelectedItems[i].Text +" " + contactsListView.SelectedItems[i].SubItems[1].Text + " [" + contactsListView.SelectedItems[i].SubItems[2].Text + "]";
        }


        this.contactsTextBox.Text += " ";
        this.contactsTextBox.SelectionStart = 0;
        this.contactsTextBox.SelectionLength = this.contactsTextBox.Text.Length-1;
        contactsTextBox.SelectionFont = new Font(contactsTextBox.SelectionFont, FontStyle.Underline);
        this.contactsTextBox.SelectionLength = 0;

총 해킹이지만 기본적으로 텍스트를 선택한 후 텍스트를 선택하면 모든 것을 선택하지 않으면 (추가 ""를 추가 한 다음 선택 텍스트를 설정하면 원하는 효과가 있습니다.

다른 팁

코드의 문제점은 선택 폰트가 선택의 글꼴이라는 것입니다. 선택이 없다면 글꼴 변경은 아무것도하지 않을 것입니다. Bfree가 제공 한 솔루션은 작동하는 것처럼 보입니다. 문서를 Word로 입력하는 경우와 같은 일입니다. 밑줄이 그어진 후에 문자를 추가하기 전에 문자를 추가하여 추가 문자가 문서를 계속할 때 원래 형식을 "저장"할 수 있습니다.

Bfree의 경우 +1이지만 아직 명성이 없습니다 :( ...

텍스트 상자 끝에 더 많은 텍스트를 추가하기 전에 커서를 끝에 놓고 글꼴을 원하는 스타일로 설정하십시오. 그런 다음 rtb.appendline ()을 호출하면 원하는 결과를 생성해야합니다.

RTB 컨트롤은 다른 워드 프로세서와 동일한 방식으로 수행된다는 것을 기억하는 것이 중요합니다. 스타일을 설정하고 타이핑을 시작합니다. 그러면 해당 스타일을 설정 한 후 입력하면 Corsor 아래에있는 속성을 취합니다.

업데이트 : 이것은 완벽하게 작동하는 것으로 보입니다.

Dim tTexts() As String = {"Dont underline me", "Underline me", "Dont underline me", "Underline me", "Dont underline me", "Underline me", "Dont underline me", "Underline me", "Dont underline me", "Underline me", "Dont underline me", "Underline me"}
    Dim tUnderline As Boolean = False
    Dim tIndex As Integer = 0

    With oRTB
        For tIndex = tTexts.GetLowerBound(0) To tTexts.GetUpperBound(0)
            If tUnderline Then
                .SelectionStart = .Text.Length
                .SelectionFont = New Font("Arial", 12, FontStyle.Underline)
            Else
                .SelectionStart = .Text.Length
                .SelectionFont = New Font("Arial", 12, FontStyle.Regular)
            End If
            .AppendText(tTexts(tIndex))
            tUnderline = Not tUnderline
        Next
    End With
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top