C#中從多行文本框的開頭刪除多行文本有沒有優雅的方式?我正在使用Microsoft Visual C#2008速成版。從C#中的多行文本框開始刪除行
編輯 - 其他詳細 在我的應用程序中的多行TextBox被禁止(即,它是僅由應用程序本身可編輯),並且每行端接一個爲「\ r \ n」個。
C#中從多行文本框的開頭刪除多行文本有沒有優雅的方式?我正在使用Microsoft Visual C#2008速成版。從C#中的多行文本框開始刪除行
編輯 - 其他詳細 在我的應用程序中的多行TextBox被禁止(即,它是僅由應用程序本身可編輯),並且每行端接一個爲「\ r \ n」個。
這是一個不完整的問題。所以假設你使用的是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();
不幸的是,無論您是使用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行。它所做的是以下情況:
我不認爲它是優雅的,因爲它基本上構建了兩個單獨的數組,然後從第二個數組構建一個字符串。更優雅的解決方案不會這樣做。
對於適用於所有TextBox類的變體+1。 – 2010-01-06 17:38:27
有一點要記住的是,該文本框的線條收集並不能準確反映用戶所認爲的線。 Lines集合基本上不受回車的影響,而用戶可以看到從一行到下一行的換行,而無需回車。這可能是也可能不是你想要的行爲。
例如,用戶將看到下面的三個線,但是在線路集合將顯示2(因爲只有2回車):
This is line number
one.
This is line 2.
而且,如果形式,和文本控件的大小會隨着控件的增長或縮小而改變。
幾年前,我寫了一篇博客文章,介紹如何確定文本框中的行數,當用戶看到它們並獲得給定行的索引時(例如獲取索引處的行:http://ryanfarley.com/blog/archive/2004/04/07/511.aspx,也許這篇文章。將幫助
這是一個有效的觀點。 – 2010-01-06 17:40:21
我應用程序中的多行文本框是禁用的(即它只能由應用程序本身編輯),並且每行都以「\ r \ n」結尾。 (我已經將此評論添加到了我的最初問題中。)感謝您的高舉。 – 2010-01-06 17:41:47
該解決方案在WPF工作對我來說:
while (LogTextBox.LineCount > Constants.LogMaximumLines)
{
LogTextBox.Text = LogTextBox.Text.Remove(0, LogTextBox.GetLineLength(0));
}
您可以用文本框的名稱替換LogTextBox,並與行的最大數量Constants.LogMaximumLines你想你的文本框
if (txtLog.Lines.Length > maxNumberLines)
{
txtLog.Lines = txtLog.Lines.Skip(txtLog.Lines.Length - maxNumberLines).ToArray();
}
注意:WPF的TextBox不包含Lines屬性。這將只適用於WinForms。 – Randolpho 2010-01-06 17:26:21
謝謝,斯坦,但我不明白你的例子中的「line => line」部分。我嘗試lines.Skip(30).Select(31,lines.Count()),但它錯了。 – 2010-01-06 17:32:42
@Jim你只需要跳過(30)。選擇(line => line)。跳過表示跳過30行,而選擇通常是轉換,所以在這種情況下沒有轉換,我們只是選擇其餘的行。實際上.Select是多餘的,我們甚至不需要它。我更新了我的答案。 – 2010-01-06 17:35:37