Domanda

Nel mio programma dopo aver fatto clic sul pulsante - le voci ListView selezionate devono essere copiate in RichTextBox. ListView contiene informazioni di contatto e l'effetto che desidero ottenere è simile a quello di Oultook (quando si scelgono i contatti dalla rubrica). Parte del mio codice che serve a questo scopo è simile a questo:

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

Sfortunatamente in qualche modo FontStyle è ereditato da tutto il testo e anche tutto ciò che inserisco dopo aver inserito ListView.

Quindi la mia domanda è: come sottolineare solo un determinato testo (dove ho fatto un errore)?

C'è un argomento simile su stackoverflow qui purtroppo nel mio caso soluzione affermata che ci sarà uno spreco di risorse.

È stato utile?

Soluzione

Prova invece:

        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;

Hack totale, ma fondamentalmente, se selezioni il testo dopo che è tutto lì, ma non selezionalo TUTTO (motivo per cui aggiungo il extra " ") e quindi imposti il ??testo di selezione, ha il effetto desiderato.

Altri suggerimenti

Il problema con il tuo codice è che SelectionFont è proprio questo: il carattere della selezione. Se non c'è alcuna selezione, la modifica del carattere non farà nulla. La soluzione offerta da BFree sembra funzionare. È la stessa cosa che farei se scrivessi il documento in WORD: aggiungerei alcuni caratteri dopo la sezione sottolineata prima di sottolinearlo, in modo che i caratteri extra "salverebbero". la formattazione originale per quando ho continuato il documento.

+1 per BFree, ma non ho ancora una reputazione :( ...

Prima di aggiungere altro testo alla fine della casella di testo, posizionare il cursore alla fine e impostare il carattere sullo stile desiderato. Quindi una chiamata a rtb.AppendLine () dovrebbe produrre i risultati desiderati.

È fondamentale ricordare che il controllo RTB funziona allo stesso modo di qualsiasi altro elaboratore di testi. Si imposta uno stile e si inizia a digitare. Quindi qualsiasi cosa digiti dopo aver impostato quello stile assumerà quegli attributi che si trovano sotto il corsetto.

Aggiornamento: Questo sembra funzionare perfettamente.

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top