複数行のテキストボックスの先頭から複数行のテキストを削除するためのC#の適切な方法はありますか?Microsoft Visual C#2008ExpressEditionを使用しています。
編集-追加の詳細 私のアプリケーションの複数行のテキストボックスは無効になっており(つまり、アプリケーション自体でのみ編集可能です)、すべての行は「\ r\n」で終了します。
これは不完全な質問です。したがって、TextBoxまたはRichTextBoxのいずれかを使用していると仮定すると、 TextBoxBaseにあるLinesプロパティを使用できます。
//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();
このソリューションは、WPFで機能します。
while (LogTextBox.LineCount > Constants.LogMaximumLines)
{
LogTextBox.Text = LogTextBox.Text.Remove(0, LogTextBox.GetLineLength(0));
}
LogTextBoxをテキストボックスの名前に置き換え、Constants.LogMaximumLinesをテキストボックスに含める最大行数に置き換えることができます。
残念ながら、いいえ。ASP.NET、WinForms、またはWPF / Silverlightのいずれを使用しているかに関係なく、複数行のTextBoxのテキストから行を削除する「エレガントな」方法はありません。いずれの場合も、不要な行を含まない文字列を作成し、Textプロパティを設定します。
WinFormsは、Linesプロパティを使用してText値を行に事前に分割することで少し役立ちますが、文字列配列であり、配列の要素を削除するのは簡単ではないため、あまり役に立ちません。
通常、このアルゴリズムは、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());
注:UnixプラットフォームでSilverlightを使用する場合は、Environment.Newlineを使用しています。他のすべての場合は、文字列に「\ r\n」を使用しても問題ありません。呼び出しに参加してください。
また、たった3行ですが、これはエレガントなソリューションとは思いません。それが行うことは次のとおりです。
基本的に2つの別々の配列を作成し、次に2番目の配列から文字列を作成するため、エレガントだとは思いません。より洗練されたソリューションではこれはできません。
覚えておくべきことの1つは、TextBoxのLinesコレクションは、ユーザーが線として表示するものを正確に反映していないということです。Linesコレクションは基本的にキャリッジリターンで機能しますが、ユーザーはキャリッジリターンなしで1つの行から次の行に行が折り返されるのを見ることができます。これは、希望する動作である場合とそうでない場合があります。
たとえば、ユーザーは以下を3行として表示しますが、Linesコレクションには2行が表示されます(キャリッジリターンが2つしかないため)。
This is line number
one.
This is line 2.
また、フォームとテキストコントロールのサイズを変更できる場合、コントロールが拡大または縮小すると、テキストに表示される線が変化します。
私は数年前に、ユーザーに表示されるテキストボックスの行数を決定し、特定の行のインデックスを取得する方法についてブログ投稿を書きました(インデックスで行を取得するなど:http://ryanfarley.com/blog /archive/2004/04/07/511.aspx、おそらくこの投稿が役立つでしょう。
if (txtLog.Lines.Length > maxNumberLines)
{
txtLog.Lines = txtLog.Lines.Skip(txtLog.Lines.Length - maxNumberLines).ToArray();
}