Cómo agregar una línea a un cuadro de texto multilínea?


¿Cómo puedo añadir una línea de texto a un multilínea TextBox?

Por ejemplo, pseudocódigo;

textBox1.Clear();
textBox1.Lines.Add("1000+");
textBox1.Lines.Add("750-999");
textBox1.Lines.Add("400-749");
...snip...
textBox1.Lines.Add("40-59");

O

textBox1.Lines.Append("brown");
textBox1.Lines.Append("brwn");
textBox1.Lines.Append("brn");
textBox1.Lines.Append("brow");
textBox1.Lines.Append("br");
textBox1.Lines.Append("brw");
textBox1.Lines.Append("brwm");
textBox1.Lines.Append("bron");
textBox1.Lines.Append("bwn");
textBox1.Lines.Append("brnw");
textBox1.Lines.Append("bren");
textBox1.Lines.Append("broe");
textBox1.Lines.Append("bewn");

Los únicos métodos que Cuadro de texto.Lines implementa (que puedo ver) son:

  • Clon
  • CopyTo
  • Es igual a
  • GetType
  • GetHashCode
  • GetEnumerator
  • Inicializar
  • GetLowerBound
  • GetUpperBound
  • getLength
  • GetLongLength
  • getValue
  • setValue
  • toString

introduzca la descripción de la imagen aquí

Author: Ian Boyd, 2011-12-16

10 answers

@Casperah señaló que estoy pensando mal en ello. A TextBox no tiene líneas, tiene texto. Ese texto se puede dividir en líneas en el CRLF, si se solicita , pero no hay noción de líneas.

La pregunta entonces es cómo lograr lo que quiero, en lugar de lo que WinForms me permite.

Otras variantes dadas tienen un error sutil:

  • textBox1.AppendText("Hello" + Environment.NewLine);
  • textBox1.AppendText("Hello" + "\r\n");
  • textBox1.Text += "Hello\r\n"
  • textbox1.Text += System.Environment.NewLine + "brown";

O bien anexan o anteponga una nueva línea cuando (podría) no ser necesaria.

Entonces, ayudante de extensión:

public static class WinFormsExtensions
{
   public static void AppendLine(this TextBox source, string value)
   {
      if (source.Text.Length==0)
         source.Text = value;
      else
         source.AppendText("\r\n"+value);
   }
}

Así que ahora:

textBox1.Clear();
textBox1.AppendLine("red");
textBox1.AppendLine("green");
textBox1.AppendLine("blue");

Y

textBox1.AppendLine(String.Format("Processing file {0}", filename));

Nota : Cualquier código es liberado al dominio público. No se requiere atribución.

 93
Author: Ian Boyd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-15 04:17:33

Yo iría con el System.Environment.NewLine o un StringBuilder

Entonces podrías agregar líneas con un constructor de cadenas como este:

StringBuilder sb = new StringBuilder();
sb.AppendLine("brown");
sb.AppendLine("brwn");

textbox1.Text += sb.ToString();

O Nueva línea como esta:

textbox1.Text += System.Environment.NewLine + "brown";

Mejor:

StringBuilder sb = new StringBuilder(textbox1.Text);
sb.AppendLine("brown");
sb.AppendLine("brwn");

textbox1.Text = sb.ToString();
 18
Author: Matt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-16 01:33:49

Anexar un \r\n a la cadena para poner el texto en una nueva línea.

textBox1.Text += ("brown\r\n");
textBox1.Text += ("brwn");

Esto producirá las dos entradas en líneas separadas.

 13
Author: DJ Quimby,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-20 16:21:22

Prueba esto

textBox1.Text += "SomeText\r\n" 

También puedes probar

textBox1.Text += "SomeText" + Environment.NewLine;

Donde \r es retorno de carro y \n es nueva línea

 5
Author: Vamsi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-16 16:22:43

Tienes que usar el método AppendText del cuadro de texto directamente. Si intenta usar la propiedad Text, el cuadro de texto no se desplazará hacia abajo a medida que se agreguen nuevas líneas.

textBox1.AppendText("Hello" + Environment.NewLine);
 3
Author: Pierre-Alain Vigeant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-16 16:27:31

La propiedad "Lines" de un cuadro de texto es una matriz de cadenas. Por definición, no puede agregar elementos a un string[] existente, como puede hacerlo con un List<string>. Simplemente no hay ningún método disponible para este propósito. En su lugar, debe crear un nuevo string[] basado en la referencia de Líneas actual y asignarlo a Líneas.

Usando un poco de Linq (. NET 3.5 o posterior):

textBox1.Lines = textBox.Lines.Concat(new[]{"Some Text"}).ToArray();

Este código está bien para agregar una línea nueva a la vez según la interacción del usuario, pero para inicializar un cuadro de texto con unos pocos docena de nuevas líneas, se llevará a cabo muy mal. Si está configurando el valor inicial de un cuadro de texto, establecería la propiedad Text directamente usando un StringBuilder (como han mencionado otras respuestas), o si está configurado para manipular la propiedad Lines, use una Lista para compilar la colección de valores y luego convertirla en una matriz para asignar a Lines:

var myLines = new List<string>();

myLines.Add("brown");
myLines.Add("brwn");
myLines.Add("brn");
myLines.Add("brow");
myLines.Add("br");
myLines.Add("brw");
...

textBox1.Lines = myLines.ToArray();

Incluso entonces, debido a que la matriz de líneas es una propiedad calculada, esto implica una gran cantidad de conversión innecesaria detrás de la escena.

 3
Author: KeithS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-16 16:57:24

La adición de Environment.NewLine o \r\n no estaba funcionando para mí, inicialmente, con mi cuadro de texto. Descubrí que había olvidado entrar en las propiedades Behavior del cuadro de texto y establecer la propiedad "Multiline" en "True" para que agregue las líneas! Solo pensé en agregar esta advertencia ya que nadie más lo hizo en las respuestas anteriores, y pensé que la caja solo se expandiría automáticamente y olvidé que necesitaba establecer la propiedad Mulitline para que funcionara. Sé que es una especie de bonehead cosa (que es el tipo de cosa que nos pasa a última hora de un viernes por la tarde), pero podría ayudar a alguien a recordar para comprobar que. Además, en la sección de Apariencia está la propiedad " Barras de desplazamiento "que necesitaba establecer en" Both", para obtener barras horizontales y verticales para que el texto pueda desplazarse y verse en su totalidad. Así que la respuesta aquí no es solo un código añadiendo Environment.NewLine o \r\n al .Text, sino también asegúrese de que su caja esté configurada correctamente con la derecha propiedad.

 1
Author: vapcguy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-20 21:29:49

Simplemente ponga un salto de línea en su texto.

No se agregan líneas como método. Multiline solo admite el uso de saltos de línea.

 0
Author: nycdan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-16 16:20:42

Si sabe cuántas líneas desea, cree una matriz de cadena con tantos miembros (por ejemplo, myStringArray). A continuación, utilice myListBox.Lines = myStringArray;

 0
Author: Kay Superstar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-12 14:31:27

Los métodos anteriores no funcionaron para mí. Tengo la siguiente excepción:

Exception : 'System.InvalidOperationException' in System.Windows.Forms.dll

Resulta que necesitaba llamar a Invoke en mis controles primero. Ver respuesta aquí .

 0
Author: Roald,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-26 16:52:39