Чи може Console.Clear використовуватись лише для очищення рядка замість цілої консолі?


78

Під час роботи над програмою запитань / відповідей для школи мені спало на думку, що я можу використати, 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()не буду мати посилання на ці значення для очищення та виведення знову. Ось чому мені цікаво, чи можу я просто задати питання, а потім стерти рядок і вивести лише відповідь (або відповіді).

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


1
Я, до речі, лише 3 тижні студентом c #.
поганий хлопчик

1
Що ти намагаєшся робити? У мене виникають труднощі з розумінням того, як ви використовуєте "відповідь" і "питання" - що це таке і що ви будуєте? І яке ваше запитання?
Michael Banzon,

Відповіді:


141

Опис

За допомогою 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();

Більше інформації


Я програмую .NET вже приблизно 8-9 років ... так що не панікуйте. Читайте Книги, знаходьте потрібних людей, щоб стежити та переглядати веб-трансляції.
dknaack

1
@badboy - Google / Bing + MSDN - ваш Інтернет-друг - якщо ви не впевнені у способі - знайдіть його та спробуйте спершу відповідь MSDN для офіційного пояснення. Розуміння API - це лише одна частина програмування ... Ось чому вони проводять курси, ступені, і це може зайняти багато практики ... ласкаво просимо до того, що, сподіваюсь, ви знайдете цікавий шлях.
Шон Уайльд,

7
Цей код, ймовірно, слід використовувати Console.BufferWidthзамість Console.WindowWidth, оскільки можливо, що символи будуть записані поза зоною видимого вікна.
NathanAldenSr

Чому взяття (Console.CursorTop - 1)не спричиняє помилку поза діапазоном? Я дивлюся на джерело C # для SetCursorPosition, і схоже, що воно використовує 'int', що робить число -1. Я бачу, що в ньому не використовується ціле число без підпису, то чому воно не видає помилку?
Пухнастий робот

@TheFluffyRobot, оскільки Console.CursorTopповертає поточний рядок, тому Console.CursorTop - 1повертає попередній рядок. Оскільки це було Console.WriteLine("Test");раніше, поточний рядок ніколи не буде 0.
Магнетрон

46

Більш простим і кращим рішенням є:

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

Він використовує повернення каретки для переходу на початок рядка, потім друкує стільки пробілів, скільки консоль має ширину, і знову повертається на початок рядка, щоб потім можна було надрукувати власний тест.


28
Для мене це працювало лише з Console.WindowWidth-1: Console.Write("\r" + new string(' ', Console.WindowWidth - 1) + "\r");
Дорін

13

"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);
}

Зазвичай це повинен бути коментар до відповідного допису (повідомлень), оскільки він сам не відповідає на запитання.
Ден Корнілеску,

7
Я не можу відповісти на їхні публікації, коли у мене недостатньо репутації, я не можу зв’язатися з авторами коментарів, через те, що не знайшов їх електронних листів, і немає сенсу спамувати те саме (не оригінальне) рішення у моїй відповіді.
Користувач0123456789

10

Це спрацювало для мене:

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

5

Моїм кращим методом є використання PadRight. Замість того, щоб спочатку очистити рядок, це очищає решту рядка після відображення нового тексту, зберігаючи крок:

Console.CursorTop = 0;
Console.CursorLeft = 0;
Console.Write("Whatever...".PadRight(Console.BufferWidth));

(BufferWidth -1)щоб не переповнювати рядок.
Різебош

2

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

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();

Для мене це чудово працює.


1

Щоб очистити від поточного положення до кінця поточного рядка, зробіть це:

    public static void ClearToEndOfCurrentLine()
    {
        int currentLeft = Console.CursorLeft;
        int currentTop = Console.CursorTop;
        Console.Write(new String(' ', Console.WindowWidth - currentLeft));
        Console.SetCursorPosition(currentLeft, currentTop);
    }

1
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);
    }
}

3
Поясніть, будь ласка, свою відповідь, щоб вона була корисною для майбутніх читачів.
Прудхві

0

Думаю, я знайшов, чому на це запитання є кілька різних відповідей. Коли розмір вікна змінено таким чином, що він має горизонтальну смугу прокрутки (оскільки буфер більше вікна), 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) код може або переміщувати курсор вгору або вниз, залежно від того, яку версію ви використовуєте з цієї сторінки, і від стану вікна.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.