好的,所以我试图在表单中创建一个像文本框一样的“控制台”,但是一旦你到达底部,可以向上滚动,它只会删除顶线,我有一些困难。 到目前为止,当它达到最低点时,它会删除顶线,但只有一次,它只是正常运行。这是我的功能:
StringBuilder sr = new StringBuilder();
public void writeLine(string input)
{
string firstline = "";
int numLines = Convert.ToString(sr).Split('\n').Length;
if (numLines > 15) //Max Lines
{
sr.Remove(0, Convert.ToString(sr).Split('\n').FirstOrDefault().Length);
}
sr.Append(input + "\r\n");
consoleTxtBox.Text = Convert.ToString(sr) + numLines;
}
如果有人能解决这个问题会很棒,谢谢
卢卡斯
答案 0 :(得分:8)
首先,您的解决方案出了什么问题:它不起作用的原因是它删除了行的内容,但它最后忽略了\n
。添加1
应该可以解决这个问题:
sr.Remove(0, Convert.ToString(sr).Split('\n').FirstOrDefault().Length+1);
// ^
// |
// This will take care of the trailing '\n' after the first line ---+
现在以更简单的方式做到这一点:您需要做的就是找到第一个\n
,并在它之后获取子串,如下所示:
string RemoveFirstLine(string s) {
return s.Substring(s.IndexOf(Environment.NewLine)+1);
}
请注意,即使字符串中没有换行符,即IndexOf
返回-1
时,此代码也不会崩溃(在这种情况下,不会删除任何内容)。
答案 1 :(得分:3)
您可以使用TextBox中的Lines属性。这将获取TextBox中的所有行,作为数组,然后创建一个不包含第一个元素(Skip(1)
)的新数组。它将这个新数组分配回文本框。
string[] lines = textBox.Lines;
textBox.Lines = lines.Skip(1).ToArray();
答案 2 :(得分:2)
一个简单的替代方法:您可以将字符串拆分为Environment.NewLine
并返回除第一个之外的所有字符串:
public static string RemoveFirstLine(string input)
{
var lines = input.Split(new[] { Environment.NewLine }, StringSplitOptions.None);
return string.Join(Environment.NewLine, lines.Skip(1));
}
答案 3 :(得分:2)
你可以删除这一行
var lines = lines.Remove(0, lines.ToString().IndexOf(Environment.NewLine));
答案 4 :(得分:0)
大多数解决方案似乎没有考虑到Enviroment.NewLine可以包含多个字符(len> 1)这一事实。
public void RemoveFirstStringFromStringBuilder()
{
var lines = new StringBuilder();
lines.AppendLine("abc");
var firstLine = lines.ToString().IndexOf(Environment.NewLine, StringComparison.Ordinal);
if (firstLine >= 0)
lines.Remove(0, firstLine + Environment.NewLine.Length);
Console.WriteLine(lines.Length);
Console.WriteLine(lines.ToString());
}
打印出:0和“”
答案 5 :(得分:0)
对我有用的是:
var strBuilder = new StringBuilder();
strBuilder.AppendLine("ABC");
strBuilder.AppendLine("54");
strBuilder.AppendLine("04");
strBuilder.Remove(0, strBuilder.ToString().IndexOf(Environment.NewLine) + 2);
Console.WriteLine(strBuilder);
+1的解决方案对我不起作用,可能是因为在这种情况下EOF被解释为2个字符(\ r \ n)