C# 控制台状态栏

C# 控制台状态栏,c#,C#,我有一个函数,可以使用以下语句更新控制台应用程序中的状态栏: Console.writeline("Status {0} Copied", i); 上述语句的问题是,过一段时间后,它会用语句填充控制台行,其中说明: Status 1 Copied Status 2 Copied 等等 有没有办法让它只刷新一行,这样1就会被2取代,依此类推,这样它就不会变成一堵文字墙?没有办法,但您可以尝试一种解决方案,在写入下一条消息之前清除控制台屏幕 Console.Clear(); 您可以尝试另一种方

我有一个函数,可以使用以下语句更新控制台应用程序中的状态栏:

Console.writeline("Status {0} Copied", i);
上述语句的问题是,过一段时间后,它会用语句填充控制台行,其中说明:

Status 1 Copied
Status 2 Copied
等等


有没有办法让它只刷新一行,这样1就会被2取代,依此类推,这样它就不会变成一堵文字墙?

没有办法,但您可以尝试一种解决方案,在写入下一条消息之前清除控制台屏幕

Console.Clear();
您可以尝试另一种方法:
“\r”
返回到当前行的开头并重新写入文本

Console.Write("\rStatus {0} copied", i);

否则您可以使用

是的,这是完全可能的,您只需跟踪您在哪一行,然后覆盖该行:

   Console.Write("0000000000");
   Console.SetCursorPosition(3, 0);
   Console.Write("55");
   Console.ReadLine();
产量:005500000

Console.WriteLine("0000000000");
Console.WriteLine("1111111111");
Console.WriteLine("2222222222");

Console.SetCursorPosition(3, 1);
Console.Write("55");
Console.ReadLine();
输出:

0000000000

115511111


2222

要在当前行的开头重复写入输出,请尝试:

private static void SetStatusLineValue(int value)
{
    Console.SetCursorPosition(0, Console.CursorTop);
    Console.Write("\rStatus {0} Copied", value);
}
甚至简单地说:
Console.Write(“\rStatus{0}复制”,value)

对于“记住”起始行或使用指定行的更灵活的解决方案:

private static void SetTextForLine(string text, ref int line)
{
    //set the status line for future reference
    if (line < 0)
    {
        line = Console.CursorTop;
    }

    //save line/cursor state
    int currentLine = Console.CursorTop;
    bool cursorVisible = Console.CursorVisible;
    Console.SetCursorPosition(0, line);
    Console.WriteLine(text);

    //restore state
    Console.CursorTop = (currentLine == line ? currentLine + 1 : currentLine);
    Console.CursorVisible = cursorVisible;
}
private static void SetTextForLine(字符串文本,ref int行)
{
//设置状态行以供将来参考
如果(线<0)
{
line=Console.CursorTop;
}
//保存行/光标状态
int currentLine=Console.CursorTop;
bool cursorVisible=Console.cursorVisible;
控制台。设置光标位置(0,行);
控制台写入线(文本);
//恢复状态
Console.CursorTop=(currentLine==line?currentLine+1:currentLine);
Console.CursorVisible=光标可见;
}
用法:

int statusLine = -1;
for (int i = 0; i < 10; i++)
{
    Console.WriteLine("Other lines in here...");

    DoLongRunningOperation();

    //update the status line here
    SetTextForLine("Status " + i + " Copied", ref statusLine);
}
int statusLine=-1;
对于(int i=0;i<10;i++)
{
Console.WriteLine(“此处的其他行…”);
多龙运行操作();
//在此处更新状态行
SetTextForLine(“状态”+i+“已复制”,参考状态行);
}
输出:

此处的其他行。。。

状态9复制我接受了答案,因为它帮助我生成了以下代码:

Console.WriteLine("Before Output");
for (int i = 0; i < 10; i++)
     {
          int currentLine = Console.CursorTop;
          Console.WriteLine("i is {0}", i);
          Thread.Sleep(500);
          Console.SetCursorPosition(0, currentLine);
     }
Console.WriteLine("After");
Console.WriteLine(“输出前”);
对于(int i=0;i<10;i++)
{
int currentLine=Console.CursorTop;
WriteLine(“i是{0}”,i);
睡眠(500);
Console.SetCursorPosition(0,currentLine);
}
控制台。写入线(“之后”);

这是我将要使用的代码。

您也可以使用方法Console.MoveBufferArea滚动控制台输出

static void Main(string[] args)
{
  Console.SetBufferSize(Console.WindowWidth, Console.WindowHeight);

  Console.CursorLeft = 0;
  Console.CursorTop = 0;

  Console.BackgroundColor = ConsoleColor.White;
  Console.ForegroundColor = ConsoleColor.Black;
  Console.Write("This is the statusbar".PadRight(Console.WindowWidth, ' '));

  Console.BackgroundColor = ConsoleColor.Black;
  Console.ForegroundColor = ConsoleColor.White;

  int line = 1;
  int totalLines = 1;
  while (true) {
    Thread.Sleep(100);

    if (line == Console.WindowHeight){
      // Scoll one line:
      Console.MoveBufferArea(0, 2, Console.WindowWidth, Console.WindowHeight - 2, 0, 1);
      line--;
    }
    Console.CursorLeft = 0;
    Console.CursorTop = line;
    Console.Write(string.Format("This is line {0}", totalLines));

    totalLines++;
    line++;
  }
}

猜测您的writeline是否在任何循环中?不可能在控制台中编辑任何记录的消息。我希望您使用一些标签,如果您使用winforms,请更改标签的文本。我不这样认为。我认为它只是
stdout
,因此只是附加在那里。我想你可以尝试一些用ASCII特殊字符作为退格符的时髦玩意儿,但我不会花钱:)这不会解决他使用
WriteLine
时的问题,应该考虑设置光标位置。这是可能的。设置光标位置是一种解决方案,而不是清除屏幕。正如rhughes所说,绝对可能,方法是构建更简单的终端托管UI的基础。