【问题标题】:C# clear Console last Item and replace new? Console AnimationC#清除控制台最后一项并替换新的?控制台动画
【发布时间】:2011-02-17 09:49:47
【问题描述】:

以下 CSharp 代码(只是示例):

Console.WriteLine("Searching file in...");

foreach(var dir in DirList)
{
    Console.WriteLine(dir);
}

打印输出为:

Searching file in...

dir1

dir2

dir3

dir4

.

.

.

问题? 我怎样才能得到输出为

Searching file in...

dir1  

(然后清除 dir1 并打印 dir2 等等)所有下一个目录名称将替换上一个目录

【问题讨论】:

标签: c# console.writeline


【解决方案1】:

使用Console.SetCursorPosition将光标设置在最后一行的开头并重写。

类似:

Console.WriteLine(dir);
Console.SetCursorPosition(0, Console.CursorTop - 1);

编辑:

根据您的评论,您可以这样做:

Console.WriteLine("Searching file in...");
foreach (var dir in DirList)
{
    ClearCurrentConsoleLine();
    Console.Write(dir);
}

ClearCurrentConsoleLine 定义为:

public static void ClearCurrentConsoleLine()
{
    int currentLineCursor = Console.CursorTop;
    Console.SetCursorPosition(0, Console.CursorTop);
    for (int i = 0; i < Console.WindowWidth; i++)
        Console.Write(" ");
    Console.SetCursorPosition(0, currentLineCursor);
}

【讨论】:

  • 如果我设置开始位置(作为当前打印行的开始),那么我需要清除。但它会清除所有屏幕
  • 您的代码对此代码运行良好。但是在我的实际代码中,我触发了一个事件 foreach 目录名称,并将当前目录名称传递给事件处理程序,并且该事件处理程序打印当前项目。我在 eventHandler 中使用 consolewriteline。我尝试了相同的代码,但它不起作用
  • @GAPS:可能你只需要在事件处理程序中调用ClearCurrentConsoleLineWrite(不是WriteLine),但我不能确定,因为我不知道你的代码.无论如何,我认为您可以轻松地调整代码以满足您的需求,您只需要弄清楚它是如何工作的,我保证,这真的很简单。
  • @digEmAii thanx,这很有帮助,但我需要根据我的代码自定义它
  • 我认为使用Console.Write(new string(' ', Console.WindowWidth - 1)) 可能比循环快一点
【解决方案2】:

如果您的问题是清除控制台,则使用方法Console.Clear();,如果不是,则使用此方法覆盖最后一行;

Console.WriteLine("Searching file in...");
        foreach(var dir in DirList)
         {
           Console.SetCursorPosition(1,0);
           Console.WriteLine(dir);
         }

【讨论】:

  • 我不想清除所有控制台。只打印最后一行
【解决方案3】:

你可以用“\r”打印,这样光标就不会跳行了,你可以重写它。

foreach(var dir in DirList)
     {
       Console.Write("\r{0}%           ",dir);
     }

在数字后使用空格以确保所有内容都被擦除,并使用 .Write 而不是 WriteLine 因为你不想添加“\n”

【讨论】:

  • 如果初始的 WriteLine 环绕,则会失败。
【解决方案4】:

只需通过保存Console.CursorLeftConsole.CursorTop 属性的值来跟踪光标的当前位置。然后写入,重置并重复。或者更确切地说,在这种情况下,重置、写入并重复。

Console.WriteLine("Searching file in...");

// save the current cursor position
var cursorLeft = Console.CursorLeft;
var cursorTop = Console.CursorTop;

// build a format string to establish the maximum width do display
var maxWidth = 60;
var fmt = String.Format("{{0,-{0}}}", maxWidth);

foreach (var dir in dirList)
{
    // restore the cursor position
    Console.SetCursorPosition(cursorLeft, cursorTop);

    // trim the name if necessary
    var name = Path.GetFileName(dir);
    if (name.Length > maxWidth)
        name = name.Substring(0, maxWidth);

    // write the trimmed name
    Console.Write(fmt, name);

    // do some work
}
Console.WriteLine(); // end the previous line

【讨论】:

  • 嗯.. 看起来很迷人。让我试试
【解决方案5】:

虽然这是一篇很老的帖子,但我会发布我的方法。也许这会对某人有所帮助

Console.SetCursorPosition(0, Console.CursorTop);
Console.Write(new String(' ', Console.WindowWidth));
Console.SetCursorPosition(0, Console.CursorTop);
Console.Write(dir);

【讨论】:

    【解决方案6】:

    我想这就是你想要的;)

    Console.WriteLine("Searching file in...");
        foreach(var dir in DirList)
         {
           Console.Write(\"r" + dir);
         }
    

    【讨论】:

      【解决方案7】:

      这将满足我认为您的要求:

      string s = "\r";
      s += new string(' ', Console.CursorLeft);
      s += "\r";
      Console.Write(s);
      

      与@digEmAll 建议的基本相同,但它使用实际的字符数而不是 Console.WindowWidth

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多