Pregunta

¿Hay una forma elegante en C# para eliminar múltiples líneas de texto desde el comienzo de un cuadro de texto multilínea? Estoy usando Microsoft Visual C# 2008 Express Edition.

Editar - detalles adicionalesEl cuadro de texto multiline 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".

¿Fue útil?

Solución

Esta es una pregunta incompleta. Entonces, suponiendo que esté utilizando TextBox o RichTextBox, puede usar el Propiedad de líneas encontrada IntextBoxBase.

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

Luego puede trabajar con esta matriz y retrasarla.

  this.textBox.Lines= newLinesArray;

Esta podría no ser la forma más elegante, pero eliminará la primera línea.Editar: no necesita seleccionar, solo usar Skip 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();

Otros consejos

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 tenga su cuadro de texto.

Desafortunadamente, no, no hay una forma "elegante" de eliminar las líneas del texto de un cuadro de texto multiline, independientemente de si está utilizando ASP.NET, WinForms o WPF/Silverlight. En todos los casos, crea una cadena que no contiene las líneas que no desea y establece la propiedad de texto.

WinForms lo ayudará un poco a la presentación del valor del texto en líneas, utilizando la propiedad de 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.

En general, este algoritmo funcionará 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 el entorno. NEWLINE específicamente para el caso de Silverlight en una plataforma UNIX. Para todos los demás casos, está perfectamente bien usando " r n" en la llamada String.Join.

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

  • divide la cuerda única en una matriz de cuerdas
  • itera sobre esa matriz y construye una segunda matriz que no incluye las líneas omitidas
  • Se une a la matriz de nuevo en una sola cadena.

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

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

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

This is line number 
one. 
This is line 2.

Además, si el formulario y el control de texto son rechazables, las líneas visibles en el texto cambiarán a medida que el control crezca o se encoge.

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 tal como el usuario las ve y obtener el índice de una línea determinada (me gusta obtener la línea en el índice: http://ryanfarley.com/blog/archive/2004/04/07/511.aspx, tal vez esta publicación ayudará.

if (txtLog.Lines.Length > maxNumberLines)
{
    txtLog.Lines = txtLog.Lines.Skip(txtLog.Lines.Length - maxNumberLines).ToArray();
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top