Pregunta

En mi programa, después de hacer clic en el botón, las entradas seleccionadas de ListView se deben copiar a RichTextBox. ListView contiene información de contacto, y el efecto que quiero lograr es similar al de Oultook (al elegir contactos del libro de contactos). Parte de mi código que sirve para este propósito se ve así:

    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);
        }
    }

Lamentablemente, de algún modo, FontStyle se hereda con todo el texto y todo lo que ingrese después de la entrada de ListView también está subrayado.

Entonces, mi pregunta es: ¿cómo subrayar solo cierto texto (donde he cometido un error)?

Hay un tema similar en stackoverflow aquí desafortunadamente en mi caso solución declarada habrá desperdicio de recursos.

¿Fue útil?

Solución

Prueba esto en su lugar:

        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;

Total hack, pero básicamente, si seleccionas el texto después de que está todo allí, pero no seleccionas TODO (por eso agrego el " " extra) y luego configuro el texto de selección, tiene el efecto deseado.

Otros consejos

El problema con su código es que SelectionFont es solo eso: la fuente de la selección. Si no hay selección, el cambio de fuente no va a hacer nada. La solución que ofreció BFree parece que funcionaría. Eso es lo mismo que haría si escribiera el documento en WORD: agregaría algunos caracteres después de la sección subrayada antes de subrayarlo para que los caracteres adicionales " guardar " el formato original para cuando continué el documento.

+1 para BFree, pero todavía no tengo reputación :( ...

Antes de agregar más texto al final del cuadro de texto, coloque el cursor al final y ajuste la fuente al estilo deseado. Luego, una llamada a rtb.AppendLine () debe producir los resultados deseados.

Es clave recordar que el control RTB funciona de la misma manera que cualquier otro procesador de textos. Estableces un estilo y empiezas a escribir. Luego, cualquier cosa que escriba después de configurar ese estilo asumirá los atributos que están bajo el corsor.

Actualización: Esto parece funcionar perfectamente.

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top