2011-12-16 129 views
44

如何添加一行文字到multi-lineTextBox如何將一行添加到多行文本框?

例如僞代碼;

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從
  • 的Equals
  • 的GetType
  • 的GetHashCode
  • 的GetEnumerator
  • 初始化
  • GetLowerBound
  • GetUpperBound
  • GetLength進行
  • GetLongLength
  • 的GetValue
  • 的SetValue
  • 的ToString

enter image description here

+1

你不能使用append(Enviroment.NewLine)嗎? – jclozano 2011-12-16 16:19:22

+1

TextBox.Lines是文本的只讀表示。請參閱http://msdn.microsoft.com/en-us/library/system.windows.forms.textboxbase.lines.aspx。 – Casperah 2011-12-16 16:21:30

+0

@Casperah Ohhh,這有助於解釋爲什麼它不能用來做我想做的事情 - 微軟(以一種不太微妙的方式)阻止你做一個較慢的代碼路徑 – 2011-12-16 16:54:32

回答

90

@Casperah指出我在想它是錯的。 A 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)); 

注意:任何代碼發佈到公共領域。無需歸屬。

13

附加一個\r\n字符串把文本在新的一行。

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

這將在不同的行上產生兩個條目。

0

只需在您的文本中插入一個換行符。

您不添加行作爲方法。 Multiline僅支持使用換行符。

15

我將與System.Environment.NewLineStringBuilder

去。然後你可以用字符串生成器,這樣添加行:

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

textbox1.Text += sb.ToString(); 

或換行是這樣的:

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

試試這個

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

你也可以嘗試

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

哪裏\r是回車和\n是新線

3

你必須直接使用文本框的AppendText方法。如果您嘗試使用Text屬性,則文本框不會隨着新行的添加而向下滾動。

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

TextBox的「Lines」屬性是一個字符串數組。根據定義,您不能將元素添加到現有的string[],就像您可以將其添加到List<string>一樣。目的根本沒有可用的方法。您必須根據當前行參考創建一個新的string[],並將其分配給行。

使用小的LINQ(.NET 3.5或更高版本):

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

此代碼是罰款基於用戶交互添加一個新的生產線的時間,但對於初始化一個文本框與幾十個新線,它將表現非常差。如果你設置了TextBox的初始值,我會直接使用StringBuilder設置Text屬性(如其他答案所述),或者如果你設置了操縱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(); 

即使是這樣,由於線陣列是計算屬性,這涉及大量的幕後不必要的轉換的。

0

如果您知道需要多少行,請使用該許多成員(例如myStringArray)創建一個String數組。 然後使用myListBox。Lines = myStringArray;

1

Environment.NewLine\r\n的加入對我來說並不適用,最初是用我的文本框。我發現我忘記進入文本框的行爲屬性,並將「Multiline」屬性設置爲「True」,以便添加行!我只是認爲我會補充這個警告,因爲沒有人在上面的答案中做過,我曾經認爲這個盒子會自動擴展,並且忘記了我需要實際設置Mulitline屬性才能工作。我知道這是某種頭腦的東西(這是在星期五下午晚些時候發生在我們身上的那種事),但它可能會幫助別人記得檢查它。另外,在外觀部分中,我需要將「ScrollBars」屬性設置爲「Both」,以便同時獲得水平和垂直條,以便文本可以實際滾動並全部看到。因此,這裏的答案不僅僅是通過在.Text上附加Environment.NewLine\r\n的代碼,而且還要確保您的盒子已正確設置並具有正確的屬性。

0

以上方法對我不起作用。我有以下異常:

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

原來我需要先請我的控制Invoke。見答案here