Как добавить строку в многострочное TextBox? - PullRequest
51 голосов
/ 16 декабря 2011

Как добавить строку текста в многострочное TextBox?

например, псевдокод;

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

или

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

Единственные методы, которые TextBox.Lines реализует (что я вижу):

  • Клон
  • CopyTo
  • равно
  • GetType
  • GetHashCode
  • GetEnumerator
  • Инициализация
  • GetLowerBound
  • GetUpperBound
  • GetLength
  • GetLongLength
  • GetValue
  • SetValue
  • ToString

enter image description here

Ответы [ 10 ]

99 голосов
/ 16 декабря 2011

@ Каспера указал, что я думаю об этом неправильно.У TextBox нет строк , текст .Этот текст может быть разбит на CRLF на строки, если требуется, но понятия строк не существует.

Тогда возникает вопрос, как выполнить то, что я хочу, а не то, что мне позволяет WinForms.

В других приведенных вариантах есть небольшая ошибка:

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

Они либо добавляют, либо добавляют новую строку, когда один (может) не требуется.

Итак, помощник по расширению:

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

Так что теперь:

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

и

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

Примечание : любой код публикуется в открытом доступе.Указание авторства не требуется.

19 голосов
/ 16 декабря 2011

Я бы пошел с System.Environment.NewLine или StringBuilder

Тогда вы можете добавить строки с помощью строителя строк, например:

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

textbox1.Text += sb.ToString();

или NewLine, как это:

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

Лучше:

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

textbox1.Text = sb.ToString();
14 голосов
/ 16 декабря 2011

Добавьте \r\n к строке, чтобы поместить текст в новую строку.

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

Это создаст две записи в отдельных строках.

5 голосов
/ 16 декабря 2011

Попробуйте это

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

Вы также можете попробовать

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

Где \r - возврат каретки, а \n - новая строка

3 голосов
/ 16 декабря 2011

Свойство «Линии» TextBox представляет собой массив строк.По определению вы не можете добавлять элементы к существующему string[], как вы можете к List<string>.Для этой цели просто нет доступных методов.Вместо этого вы должны создать новый string[] на основе текущей ссылки на строки и назначить его для строк.

Использование небольшого Linq (.NET 3.5 или более поздней версии):

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

Этот код подходит для добавления одной новой строки за раз в зависимости от взаимодействия с пользователем, но для инициализации текстового поля сНесколько десятков новых линий, он будет работать очень плохо.Если вы устанавливаете начальное значение TextBox, я бы либо установил свойство Text напрямую с помощью StringBuilder (как уже упоминалось в других ответах), либо, если вы настроены на манипулирование свойством Lines, используйте List для компиляции коллекциизначений и затем преобразуйте его в массив для присвоения строкам:

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

Даже в этом случае, поскольку массив строк является вычисляемым свойством, это требует большого количества ненужных преобразований за кулисами.

3 голосов
/ 16 декабря 2011

Вы должны использовать метод AppendText в текстовом поле напрямую.Если вы попытаетесь использовать свойство Text, текстовое поле не будет прокручиваться вниз при добавлении новой строки.

textBox1.AppendText("Hello" + Environment.NewLine);
1 голос
/ 21 мая 2016

Добавление Environment.NewLine или \r\n изначально не работало для меня с моим текстовым полем. Я обнаружил, что забыл зайти в свойства текстового поля Поведение и установить для свойства " Multiline " значение " True ", чтобы добавить строки! Я просто подумал, что добавлю это предостережение, поскольку никто не сделал этого в ответах выше, и я подумал, что окно просто собирается автоматически расширяться, и забыл, что мне нужно на самом деле установить свойство Mulitline, чтобы оно работало. Я знаю, что это что-то вроде костей (это то, что случается с нами поздно вечером в пятницу), но это может помочь кому-то не забыть проверить это. Кроме того, в разделе «Внешний вид» есть свойство «ScrollBars», которое мне нужно было установить на «Оба», чтобы получить как горизонтальные, так и вертикальные полосы, чтобы текст можно было прокручивать и видеть полностью. Таким образом, ответ здесь не просто кодовый, добавляя Environment.NewLine или \r\n к .Text, но также убедитесь, что ваш ящик настроен правильно с правильными свойствами.

0 голосов
/ 26 января 2018

Вышеописанные методы не сработали для меня. Я получил следующее исключение:

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

Оказывается, мне нужно было сначала вызвать Invoke на моем контроле. Смотрите ответ здесь .

0 голосов
/ 12 сентября 2014

Если вы знаете, сколько строк вы хотите, создайте массив String с таким количеством членов (например, myStringArray).Затем используйте myListBox.Lines = myStringArray;

0 голосов
/ 16 декабря 2011

Просто вставьте разрыв строки в ваш текст.

Вы не добавляете строки как метод.Multiline просто поддерживает использование разрывов строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...