Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 删除C中多行文本框开头的行_C#_Textbox_Multiline - Fatal编程技术网

C# 删除C中多行文本框开头的行

C# 删除C中多行文本框开头的行,c#,textbox,multiline,C#,Textbox,Multiline,在C语言中,有没有一种优雅的方法可以从多行文本框的开头删除多行文本?我正在使用Microsoft Visual C 2008快速版 编辑-其他详细信息 我的应用程序中的多行文本框被禁用,即它只能由应用程序本身编辑,并且每一行都以一个\r\n结尾。不幸的是,不,无论您使用的是ASP.NET、WinForms还是WPF/Silverlight,都无法从多行文本框的文本中删除行。在每种情况下,都会生成一个不包含不需要的行的字符串,并设置Text属性 WinForms将通过使用lines属性将文本值预拆

在C语言中,有没有一种优雅的方法可以从多行文本框的开头删除多行文本?我正在使用Microsoft Visual C 2008快速版

编辑-其他详细信息
我的应用程序中的多行文本框被禁用,即它只能由应用程序本身编辑,并且每一行都以一个\r\n结尾。

不幸的是,不,无论您使用的是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,专门用于Unix平台上的Silverlight。对于所有其他情况,在string.Join调用中使用\r\n完全可以

我也不认为这是一个优雅的解决方案,尽管它只有3行。它的作用如下:

将单个字符串拆分为字符串数组 迭代该数组并生成不包含跳过行的第二个数组 将数组重新合并为单个字符串。

我不认为它很优雅,因为它基本上构建了两个独立的数组,然后从第二个数组构建一个字符串。更优雅的解决方案无法做到这一点

这是一个不完整的问题。因此,假设您使用的是TextBox或RichTextBox,则可以使用

然后可以使用此数组并将其设置回原位

  this.textBox.Lines= newLinesArray;
这可能不是最优雅的方式,但它将删除第一行。 编辑:您不需要选择,只需使用跳过即可


需要记住的一点是,TextBox的Lines集合不能准确地反映用户所看到的行。Lines集合基本上是在回车的情况下工作的,而用户可以看到行在没有回车的情况下从一行换行到下一行。这可能是你想要的行为,也可能不是

例如,用户将看到以下三行,但lines集合将显示2,因为只有2个回车:

This is line number 
one. 
This is line 2.
此外,如果窗体和文本控件可调整大小,则文本中的可见行将随着控件的增大或缩小而改变


几年前,我写了一篇博文,内容是关于如何在用户看到文本框时确定行数,并获取给定行的索引,就像获取索引处的行一样,这篇博文可能会有所帮助。

这个解决方案在WPF中对我有效:

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

您可以将LogTextBox替换为文本框的名称,将Constants.LogMaximumLines替换为希望文本框具有的最大行数。

注意:WPF的TextBox不包含lines属性。这只适用于WinForms。谢谢,Stan,但我不理解示例中的line=>line部分。我尝试了lines.Skip30.Select31,lines.Count,但出现了错误。@Jim您只需要Skip30.SelectLine=>line。跳过意味着跳过30行,选择通常是一个转换,所以在这种情况下没有转换,我们只是选择后面的行。事实上.Select是多余的,我们甚至不需要它。我更新了我的答案。@StanR。当使用由应用程序本身日志条目填充的文本框时,此代码会导致位置从上到下连续切换。有没有办法在没有这种滚动行为的情况下执行同样的操作?我的应用程序中的多行文本框被禁用,即它只能由应用程序本身编辑,并且每一行都以一个\r\n结尾。我在最初的问题中添加了这一评论。谢谢你的提醒。
if (txtLog.Lines.Length > maxNumberLines)
{
    txtLog.Lines = txtLog.Lines.Skip(txtLog.Lines.Length - maxNumberLines).ToArray();
}
while (LogTextBox.LineCount > Constants.LogMaximumLines)
{
    LogTextBox.Text = LogTextBox.Text.Remove(0, LogTextBox.GetLineLength(0));
}
if (txtLog.Lines.Length > maxNumberLines)
{
    txtLog.Lines = txtLog.Lines.Skip(txtLog.Lines.Length - maxNumberLines).ToArray();
}