Как выборочно подчеркнуть строки в 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;

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

Другие советы

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

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

Прежде чем добавлять дополнительный текст в конец текстового поля, установите курсор в конце и установите шрифт в нужном стиле.Затем вызов rtb.AppendLine() должен привести к желаемым результатам.

Важно помнить, что элемент управления RTB работает таким же образом, как и любой другой текстовый процессор.Вы устанавливаете стиль и начинаете печатать.Тогда все, что вы введете после настройки этого стиля, приобретет те атрибуты, которые находятся под корсетом.

Обновить:Кажется, это работает отлично.

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