2010-01-06 69 views
9

C#中從多行文本框的開頭刪除多行文本有沒有優雅的方式?我正在使用Microsoft Visual C#2008速成版。從C#中的多行文本框開始刪除行

編輯 - 其他詳細 在我的應用程序中的多行TextBox被禁止(即,它是僅由應用程序本身可編輯),並且每行端接一個爲「\ r \ n」個。

回答

13

這是一個不完整的問題。所以假設你使用的是TextBox或RichTextBox,你可以使用Lines property found inTextBoxBase

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

然後,您可以使用此數組並將其設置回來。

this.textBox.Lines= newLinesArray; 

這可能不是最優雅的方式,但它會刪除第一行。 編輯:你不需要選擇,只是用跳躍將被罰款

//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(); 
+0

注意:WPF的TextBox不包含Lines屬性。這將只適用於WinForms。 – Randolpho 2010-01-06 17:26:21

+0

謝謝,斯坦,但我不明白你的例子中的「line => line」部分。我嘗試lines.Skip(30).Select(31,lines.Count()),但它錯了。 – 2010-01-06 17:32:42

+0

@Jim你只需要跳過(30)。選擇(line => line)。跳過表示跳過30行,而選擇通常是轉換,所以在這種情況下沒有轉換,我們只是選擇其餘的行。實際上.Select是多餘的,我們甚至不需要它。我更新了我的答案。 – 2010-01-06 17:35:37

5

不幸的是,無論您是使用ASP.NET,WinForms還是WPF/Silverlight,不存在「優雅」的方式來刪除多行文本框中的行。在任何情況下,您都會創建一個不包含不需要的行的字符串,並設置Text屬性。

WinForms將通過使用Lines屬性將文本值預分割成行來幫助您一點點,但它不是非常有用,因爲它是一個字符串數組,並且刪除數組元素並不容易。

一般來說,這種算法將用於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()); 

注:我使用Environment.Newline專門的Silverlight在Unix平臺上的情況。對於所有其他情況,使用string.Join調用中的「\ r \ n」完全可以。

此外,我不認爲這是一個優雅的解決方案,即使它只有3行。它所做的是以下情況:

  • 拆分單一字符串轉換成字符串
  • 遍歷數組的數組,並建立第二陣列不包括行跳過
  • 加入陣列回成單個字符串。

我不認爲它是優雅的,因爲它基本上構建了兩個單獨的數組,然後從第二個數組構建一個字符串。更優雅的解決方案不會這樣做。

+0

對於適用於所有TextBox類的變體+1。 – 2010-01-06 17:38:27

1

有一點要記住的是,該文本框的線條收集並不能準確反映用戶所認爲的線。 Lines集合基本上不受回車的影響,而用戶可以看到從一行到下一行的換行,而無需回車。這可能是也可能不是你想要的行爲。

例如,用戶將看到下面的三個線,但是在線路集合將顯示2(因爲只有2回車):

This is line number 
one. 
This is line 2. 

而且,如果形式,和文本控件的大小會隨着控件的增長或縮小而改變。

幾年前,我寫了一篇博客文章,介紹如何確定文本框中的行數,當用戶看到它們並獲得給定行的索引時(例如獲取索引處的行:http://ryanfarley.com/blog/archive/2004/04/07/511.aspx,也許這篇文章。將幫助

+0

這是一個有效的觀點。 – 2010-01-06 17:40:21

+0

我應用程序中的多行文本框是禁用的(即它只能由應用程序本身編輯),並且每行都以「\ r \ n」結尾。 (我已經將此評論添加到了我的最初問題中。)感謝您的高舉。 – 2010-01-06 17:41:47

7

該解決方案在WPF工作對我來說:

while (LogTextBox.LineCount > Constants.LogMaximumLines) 
{ 
    LogTextBox.Text = LogTextBox.Text.Remove(0, LogTextBox.GetLineLength(0)); 
} 

您可以用文本框的名稱替換LogTextBox,並與行的最大數量Constants.LogMaximumLines你想你的文本框

1
if (txtLog.Lines.Length > maxNumberLines) 
{ 
    txtLog.Lines = txtLog.Lines.Skip(txtLog.Lines.Length - maxNumberLines).ToArray(); 
}