Как выборочно подчеркнуть строки в RichTextBox? - PullRequest
1 голос
/ 04 мая 2009

В моей программе после нажатия на кнопку - выбранные записи 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 здесь к сожалению, в моем случае решение гласило, что будут растраты ресурсов.

Ответы [ 3 ]

3 голосов
/ 04 мая 2009

Попробуйте вместо этого:

        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;

Всего взломать, но в основном, если вы выделите текст после того, как все это есть, но не выделите ВСЕ его (вот почему я добавляю лишние ""), а затем установите выделенный текст, это даст желаемый эффект .

0 голосов
/ 04 мая 2009

Проблема с вашим кодом в том, что SelectionFont - это просто шрифт выделения. Если выбора нет, смена шрифта ничего не даст. Решение, предложенное BFree, похоже, будет работать. Это то же самое, что я сделал бы, если бы набирал документ в WORD - я бы добавил несколько символов после подчеркнутого раздела, прежде чем подчеркнуть его, чтобы дополнительные символы «сохранили» исходное форматирование, когда я продолжу документ.

+ 1 для BFree, но у меня еще нет репутации :( ...

0 голосов
/ 04 мая 2009

Прежде чем добавить больше текста в конец текстового поля, поместите курсор в конец и установите шрифт на нужный стиль. Затем вызов функции 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
...