3

在我的程序中单击按钮后 - 应将选定的 ListView 条目复制到 RichTextBox。ListView 包含联系人信息,我想要完成的效果类似于 Oulook 中的效果(从通讯录中选择联系人时)。用于此目的的部分代码如下所示:

    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 上有类似的主题,说明会浪费资源。

4

3 回答 3

4

试试这个:

        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;

完全破解,但基本上,如果您在文本全部存在之后选择文本,但不要选择全部(这就是我添加额外的“”)然后设置选择文本,它具有预期的效果。

于 2009-05-04T19:02:55.847 回答
0

在将更多文本添加到文本框的末尾之前,请将光标放在末尾,并将字体设置为所需的样式。然后调用 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
于 2009-05-04T18:52:05.920 回答
0

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

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

于 2009-05-04T19:42:48.200 回答