Domanda

C'è un modo grazioso in C # per eliminare più righe di testo dall'inizio di una casella di testo multilinea? Sto usando Microsoft Visual C # 2008 Express Edition.

Modifica - Dettagli aggiuntivi La casella di testo multilinea nella mia richiesta è disabilitata (vale a dire che è modificabile solo con l'applicazione stessa), e ogni linea termina con un "\ r \ n".

È stato utile?

Soluzione

Questa è una domanda incompleta. Quindi, supponendo che si sta utilizzando sia TextBox o RichTextBox è possibile utilizzare la linee di proprietà trovato inTextBoxBase .

//get all the lines out as an arry
string[] lines = this.textBox.Lines;

È quindi possibile lavorare con questo array e impostare nuovamente.

  this.textBox.Lines= newLinesArray;

Questo potrebbe non essere il modo più elegante, ma sarà rimuovere la prima riga. EDIT: non è necessario selezionare, usando solo salto andrà bene

    //number of lines to remove from the beginning
    int numOfLines = 30; 
    var lines = this.textBox1.Lines;
    var newLines = lines.Skip(numOfLines);

    this.textBox1.Lines = newLines.ToArray();

Altri suggerimenti

Questa soluzione funziona per me in WPF:

while (LogTextBox.LineCount > Constants.LogMaximumLines)
{
    LogTextBox.Text = LogTextBox.Text.Remove(0, LogTextBox.GetLineLength(0));
}

È possibile sostituire LogTextBox con il nome della casella di testo e Constants.LogMaximumLines con il numero massimo di righe che si desidera la vostra casella di testo per avere.

Purtroppo, no, non esiste un modo "elegante" per eliminare righe dal testo di una TextBox multilinea, indipendentemente dal fatto che si sta utilizzando ASP.NET, WinForms, WPF o / Silverlight. In ogni caso, si genera una stringa che non contiene le linee che non si desidera e impostare la proprietà Text.

WinForms vi aiuterà un po 'pre-splitting il valore del testo in linee, utilizzando la proprietà Lines, ma non è molto utile perché è un array di stringhe, e non è esattamente facile da eliminare un elemento di un array.

In generale, questo algoritmo funziona per tutte le possibili versioni della classe TextBox:

var lines = (from item in myTextBox.Text.Split('\n') select item.Trim());
lines = lines.Skip(numLinesToSkip);
myTextBox.Text = string.Join(Environment.Newline, lines.ToArray());

Nota: sto usando Environment.Newline specificamente per il caso di Silverlight su una piattaforma Unix. Per tutti gli altri casi, si sta perfettamente bene con "\ r \ n" nella chiamata string.join.

Inoltre, non ritengo questa una soluzione elegante, anche se è solo 3 linee. Ciò che fa è il seguente:

  • divide la singola stringa in un array di stringhe
  • itera che matrice e costruisce una seconda matrice che non include le linee saltati
  • si unisce l'array di nuovo in una singola stringa.

Non considero elegante perché si basa essenzialmente due array separati, quindi costruisce una stringa dalla seconda matrice. Una soluzione più elegante non farebbe questo.

Una cosa da tenere a mente è che la raccolta Linee del controllo TextBox non riflette con precisione ciò che l'utente vede come linee. La collezione Linee funziona praticamente fuori di ritorni a capo, mentre l'utente potrebbe vedere linee di confezionamento da una linea all'altra senza un ritorno a capo. Questo può o non può essere il comportamento desiderato.

Ad esempio, l'utente potrebbe vedere la seguente come tre linee, ma la raccolta Lines mostrerà 2 (poiché vi sono solo 2 ritorni al capo):

This is line number 
one. 
This is line 2.

Inoltre, se la forma e il controllo di testo sono ridimensionabili le righe visibili nel testo cambieranno come controllo cresce o riduce.

ho scritto un post sul blog diversi anni fa su come determinare il numero di righe nella casella di testo come l'utente li vede e ottenere l'indice di una data linea (come ad alzarsi la linea dell'indice: http://ryanfarley.com/blog/archive/2004/04/07/511.aspx , forse questo post vi aiuterà.

if (txtLog.Lines.Length > maxNumberLines)
{
    txtLog.Lines = txtLog.Lines.Skip(txtLog.Lines.Length - maxNumberLines).ToArray();
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top