web-dev-qa-db-ja.com

複数行のTextBoxに行を追加する方法は?

複数行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

52
Ian Boyd

@Casperahは、私はそれが間違っていると考えていると指摘しました。 TextBoxhave行ではなく、textを持ちます。要求された場合、そのテキストは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));

:すべてのコードはパブリックドメインにリリースされます。帰属は必要ありません。

99
Ian Boyd

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

\r\nを文字列に追加して、テキストを新しい行に配置します。

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

これにより、2つのエントリが別々の行に作成されます。

14
DJ Quimby

これを試して

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

あなたも試すことができます

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

\rはキャリッジリターン、\nは改行です

5
Vamsi

テキストボックスのAppendTextメソッドを直接使用する必要があります。 Textプロパティを使用しようとすると、新しい行が追加されるため、テキストボックスは下にスクロールしません。

textBox1.AppendText("Hello" + Environment.NewLine);

TextBoxの「Lines」プロパティは、文字列の配列です。定義により、string[]にできるように、既存のList<string>に要素を追加することはできません。目的に使用できる方法はありません。代わりに、現在のLines参照に基づいて新しいstring[]を作成し、それをLinesに割り当てる必要があります。

少しのLinq(.NET 3.5以降)を使用する:

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

このコードは、ユーザーの操作に基づいて一度に1行の新しい行を追加するのに適していますが、数十行の新しい行でテキストボックスを初期化する場合、非常にパフォーマンスが低下します。 TextBoxの初期値を設定している場合は、StringBuilderを使用してTextプロパティを直接設定するか(他の回答で述べたように)、Linesプロパティを操作するように設定している場合は、Listを使用してコレクションをコンパイルします値の配列を配列に変換して、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();

それでも、Lines配列は計算されたプロパティであるため、バックグラウンドで多くの不必要な変換が行われます。

3
KeithS

Environment.NewLineまたは\r\nを追加しても、最初はテキストボックスで機能しませんでした。テキストボックスのBehaviorプロパティに移動して、行を追加するために "Multiline"プロパティを "True"に設定するのを忘れていたことがわかりました。 !上記の答えに誰もしなかったので、この警告を追加すると思っただけで、ボックスが自動拡張されると思っていたので、Mulitlineプロパティを実際に設定する必要があることを忘れていました。私はそれが一種の骨頭のようなものであることを知っています(金曜日の午後遅くに私たちに起こる種類のことです)が、それは誰かがそれをチェックすることを覚えているのを助けるかもしれません。また、Appearanceセクションには「ScrollBars」プロパティがあり、テキストを実際にスクロールして全体を表示できるように、水平バーと垂直バーの両方を取得するために「Both」に設定する必要がありました。したがって、ここでの答えは、Environment.NewLineまたは\r\n.Textに追加するだけのコードではなく、適切なプロパティでボックスが適切に設定されていることを確認してください。

1
vapcguy

テキストに改行を入れるだけです。

メソッドとして行を追加しません。マルチラインは、改行の使用をサポートするだけです。

0
nycdan

上記の方法はうまくいきませんでした。次の例外が発生しました。

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

まず、コントロールでInvokeを呼び出す必要がありました。回答を参照してください こちら

0
Roald

必要な行数がわかっている場合は、その数のメンバーを持つストリングの配列(myStringArrayなど)を作成します。次に、myListBox.Lines = myStringArray;を使用します。

0
Kay Superstar