2010-01-06 31 views
9

¿Hay alguna manera elegante en C# de eliminar varias líneas de texto desde el comienzo de un cuadro de texto de varias líneas? Estoy usando Microsoft Visual C# 2008 Express Edition.Eliminar líneas desde el comienzo del cuadro de texto de líneas múltiples en C#

EDITAR - Detalles adicionales El cuadro de texto de varias líneas en mi solicitud se desactiva (es decir, es sólo editable por la propia aplicación), y cada línea se termina con un "\ r \ n".

Respuesta

13

Esta es una pregunta incompleta. Suponiendo que está utilizando TextBox o RichTextBox, puede usar el Lines property found inTextBoxBase.

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

A continuación, puede trabajar con esta matriz y volver a establecerla.

this.textBox.Lines= newLinesArray; 

Puede que esta no sea la manera más elegante, pero eliminará la primera línea. EDIT: no es necesario seleccionar, simplemente usando salto va a estar bien

//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(); 
+0

NOTA: TextBox de WPF no contiene una propiedad Lines. Esto solo funcionará para WinForms. – Randolpho

+0

Gracias, Stan, pero no entiendo la parte "line => line" de su ejemplo. Intenté líneas. Skip (30) .Seleccione (31, lines.Count()) pero tenía errores. –

+0

@Jim solo necesita saltar (30) .Seleccionar (línea => línea). Omitir significa omitir 30 líneas y Select suele ser una transformación, por lo que en este caso no hay transformación, solo estamos seleccionando las líneas restantes después. De hecho, .Select es redundante y ni siquiera lo necesitamos. Actualicé mi respuesta. –

5

Desafortunadamente, no, no hay una forma "elegante" de eliminar líneas del texto de un TextBox de varias líneas, independientemente de si está utilizando ASP.NET, WinForms o WPF/Silverlight. En todos los casos, construyes una cadena que no contiene las líneas que no deseas y configuras la propiedad de Texto.

WinForms lo ayudará un poco dividiendo previamente el valor de Texto en líneas, usando la propiedad Líneas, pero no es muy útil porque es una matriz de cadenas y no es exactamente fácil eliminar un elemento de una matriz.

Por lo general, este algoritmo funciona para todas las versiones posibles de la clase 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: Estoy usando Environment.NewLine específicamente para el caso de Silverlight en una plataforma Unix. Para todos los demás casos, está perfectamente bien usar "\ r \ n" en la cadena. Hacer llamada.

Además, no considero que esta sea una solución elegante, a pesar de que solo son 3 líneas. Lo que hace es la siguiente:

  • divide la cadena única en una matriz de cadenas
  • itera sobre esa matriz y construye una segunda matriz que no incluyen las líneas omiten
  • se une a la matriz de nuevo en una cuerda simple

No lo considero elegante porque esencialmente construye dos matrices separadas, luego construye una cadena de la segunda matriz. Una solución más elegante no haría esto.

+0

+1 para una variación que funciona en todas las clases de TextBox. –

1

Una cosa a tener en cuenta es que la colección de líneas del cuadro de texto no refleja con exactitud lo que el usuario ve como líneas. La colección Líneas funciona, básicamente, a partir de retornos de carro, mientras que el usuario puede ver líneas que se envuelven de una línea a la siguiente sin un retorno de carro. Esto puede o no ser el comportamiento que desea.

Por ejemplo, el usuario vería el siguiente como tres líneas, pero la colección líneas mostrarán 2 (ya que sólo hay 2 retornos de carro):

This is line number 
one. 
This is line 2. 

Además, si el formulario, y el texto el control se puede cambiar de tamaño, las líneas visibles en el texto cambiarán a medida que el control crezca o se encoja.

Escribí una publicación de blog hace varios años sobre cómo determinar el número de líneas en el cuadro de texto a medida que el usuario las ve y obtener el índice de una línea determinada (como para obtener la línea en el índice: http://ryanfarley.com/blog/archive/2004/04/07/511.aspx, quizás esta publicación . ayudará

+0

este es un punto válido. –

+0

El cuadro de texto de líneas múltiples en mi aplicación está deshabilitado (es decir, solo es editable por la aplicación en sí), y cada línea termina con un "\ r \ n". (He agregado este comentario a mi pregunta inicial.) Gracias por el aviso. –

7

Esta solución funciona para mí en WPF:

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

puede reemplazar LogTextBox con el nombre de su cuadro de texto y Constants.LogMaximumLines con el número máximo de líneas que desea que su cuadro de texto tener.

1
if (txtLog.Lines.Length > maxNumberLines) 
{ 
    txtLog.Lines = txtLog.Lines.Skip(txtLog.Lines.Length - maxNumberLines).ToArray(); 
} 
Cuestiones relacionadas