如何有选择地为RichTextBox中的字符串加下划线?

时间:2009-05-04 18:41:44

标签: c# richtextbox rtf

在我的程序中单击按钮后 - 选中的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 here上有类似的主题,遗憾的是,在我的案例中,解决方案表明会浪费资源。

3 个答案:

答案 0 :(得分:3)

请改为尝试:

        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;

总的黑客攻击,但基本上,如果你选择了文本全部,但不要选择全部(这就是为什么我添加了额外的“”),然后设置选择文本,它具有所需的效果

答案 1 :(得分:0)

在文本框末尾添加更多文本之前,将光标放在末尾,然后将字体设置为所需的样式。然后调用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

答案 2 :(得分:0)

您的代码存在的问题是SelectionFont就是 - 选择的字体。如果没有选择,字体更改将不会执行任何操作。 BFree提供的解决方案似乎可行。如果我在WORD中键入文档,那将是我要做的事情 - 我在下划线部分之后添加一些字符,然后我加下划线,这样额外的字符将“保存”原始格式,以便我继续文档。

为BFree +1,但我还没有声誉:( ...