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