Можно ли использовать Console.Clear для очистки только строки вместо всей консоли? - PullRequest
59 голосов
/ 20 января 2012

Во время работы над программой вопросов / ответов для школы мне пришло в голову, что я могу использовать Console.Clear(), чтобы стереть все с экрана.Интересно, могу ли я использовать Console.Readline(valueOne), тогда выводить только ответ без вопроса.Если бы я задал только один вопрос, Console.Clear работает.

У меня есть несколько вопросов со значениями, а не ссылками, чтобы стереть, если это возможно.Я хочу пропустить вопросы и отображать только несколько ответов.Я думаю, что если я сохраню ответы, я мог бы использовать Console.Clear(), тогда просто Console.WriteLine() с тремя переменными.Я мог бы сделать что-то вроде этого:

Console.WriteLine("Value 1 is: {0:c}" + "Value 2 is: {1:c}" + "Value 3 is: {2:c}, valueOne, valueTwo, valueThree).

Проблема проще со ссылками, потому что значения хранятся и извлекаются.Если я просто использую методы для передачи по значению и вывода значения, main() не будет иметь ссылки на эти значения для очистки и вывода снова.Вот почему мне интересно, могу ли я просто задать вопрос, затем стереть строку и вывести только ответ (или ответы).

Я просто пытаюсь понять возможности и не пытаюсь настроить программу.Мне нравится знать, как выводить значение из справочника и по значению без лишних вопросов.

Ответы [ 9 ]

113 голосов
/ 20 января 2012

Описание

Вы можете использовать функцию Console.SetCursorPosition для перехода к определенному номеру строки. Чем вы можете использовать эту функцию, чтобы очистить линию

public static void ClearCurrentConsoleLine()
{
    int currentLineCursor = Console.CursorTop;
    Console.SetCursorPosition(0, Console.CursorTop);
    Console.Write(new string(' ', Console.WindowWidth)); 
    Console.SetCursorPosition(0, currentLineCursor);
}

Пример

Console.WriteLine("Test");
Console.SetCursorPosition(0, Console.CursorTop - 1);
ClearCurrentConsoleLine();

Дополнительная информация

36 голосов
/ 29 декабря 2012

Более простое и лучшее решение:

Console.Write("\r" + new string(' ', Console.WindowWidth) + "\r");

Он использует возврат каретки для перехода к началу строки, затем печатает столько пробелов, сколько консоль имеет ширину, и снова возвращается к началу строки, поэтому вы можете напечатать свой собственный тест после этого.

8 голосов
/ 23 апреля 2016

«ClearCurrentConsoleLine», «ClearLine» и остальные вышеперечисленные функции должны использовать Console.BufferWidth вместо Console.WindowWidth (вы можете понять, почему при попытке уменьшить размер окна). Размер окна консоли в настоящее время зависит от ее буфера и не может быть шире, чем он. Пример (спасибо Дану Корнилеску):

public static void ClearLastLine()
{
    Console.SetCursorPosition(0, Console.CursorTop - 1);
    Console.Write(new string(' ', Console.BufferWidth));
    Console.SetCursorPosition(0, Console.CursorTop - 1);
}
8 голосов
/ 26 июля 2013

Это сработало для меня:

static void ClearLine(){
    Console.SetCursorPosition(0, Console.CursorTop);
    Console.Write(new string(' ', Console.WindowWidth)); 
    Console.SetCursorPosition(0, Console.CursorTop - 1);
}
4 голосов
/ 31 января 2017

Мой предпочтительный метод - использовать PadRight. Вместо того, чтобы сначала очистить строку, она очищает остаток строки после отображения нового текста, сохраняя шаг:

Console.CursorTop = 0;
Console.CursorLeft = 0;
Console.Write("Whatever...".PadRight(Console.BufferWidth));
1 голос
/ 21 марта 2015

Чтобы очистить от текущей позиции до конца текущей строки, сделайте следующее:

    public static void ClearToEndOfCurrentLine()
    {
        int currentLeft = Console.CursorLeft;
        int currentTop = Console.CursorTop;
        Console.Write(new String(' ', Console.WindowWidth - currentLeft));
        Console.SetCursorPosition(currentLeft, currentTop);
    }
1 голос
/ 01 октября 2013

Мы могли бы просто написать следующий метод

public static void ClearLine()
{
    Console.SetCursorPosition(0, Console.CursorTop - 1);
    Console.Write(new string(' ', Console.WindowWidth));
    Console.SetCursorPosition(0, Console.CursorTop - 1);
}

и затем вызывать его при необходимости следующим образом:

Console.WriteLine("Test");
ClearLine();

Он отлично работает для меня.

0 голосов
/ 17 марта 2016

Я думаю, я нашел, почему есть несколько разных ответов на этот вопрос.Когда окно было изменено так, что оно имеет горизонтальную полосу прокрутки (потому что буфер больше, чем окно), Console.CursorTop, кажется, возвращает неправильную строку.Следующий код работает для меня, независимо от размера окна или положения курсора.

public static void ClearLine()
{
    Console.SetCursorPosition(0, Console.CursorTop);
    Console.Write(new string(' ', Console.WindowWidth));
    Console.SetCursorPosition(0, Console.CursorTop - (Console.WindowWidth >= Console.BufferWidth ? 1 : 0));
}

Без (Console.WindowWidth> = Console.BufferWidth? 1: 0) код может перемещать курсор вверх иливниз, в зависимости от того, какую версию вы используете на этой странице, и от состояния окна.

0 голосов
/ 03 августа 2015
public static void ClearLine(int lines = 1)
{
    for (int i = 1; i <= lines; i++)
    {
        Console.SetCursorPosition(0, Console.CursorTop - 1);
        Console.Write(new string(' ', Console.WindowWidth));
        Console.SetCursorPosition(0, Console.CursorTop - 1);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...