Kann Console.Clear verwendet werden, um nur eine Zeile anstelle der gesamten Konsole zu löschen?

77

Während ich an einem Frage / Antwort-Programm für die Schule arbeitete, kam mir Console.Clear()der Gedanke, dass ich damit alles auf dem Bildschirm auslöschen kann. Ich frage mich, ob ich Console.Readline(valueOne)nur die Antwort ohne die Frage ausgeben kann . Wenn ich nur eine Frage gestellt habe, Console.Clearfunktioniert das.

Ich habe mehrere Fragen mit Werten, die keine Referenzen sind, um sie nach Möglichkeit zu löschen. Ich möchte die Fragen weglassen und nur einige Antworten anzeigen. Ich denke, wenn ich die Antworten speichere, könnte ich sie Console.Clear()dann nur Console.WriteLine()mit drei Variablen verwenden. Ich könnte so etwas machen:

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

Das Problem ist bei Referenzen einfacher, da die Werte gespeichert und abgerufen werden. Wenn ich einfach Methoden verwende, um den Wert zu übergeben und den Wert auszugeben, habe main()ich keinen Verweis auf diese Werte, um ihn zu löschen und erneut auszugeben. Deshalb frage ich mich, ob ich nur eine Frage stellen, dann die Zeile löschen und nur die Antwort (oder die Antworten) ausgeben kann.

Ich versuche nur, die Möglichkeiten zu verstehen und nicht, ein Programm einzurichten. Ich möchte die Fähigkeit kennen, einen Wert aus der Referenz und nach Wert ohne zusätzliche Ausgabefragen auszugeben.

böser Bub
quelle
1
Ich bin übrigens nur ein 3-wöchiger Student von c #.
böser Junge
1
Was versuchst du zu machen? Ich habe Schwierigkeiten, Ihre Verwendung von "Antwort" und "Frage" zu verstehen - was sind sie und was bauen Sie? Und was ist deine Frage?
Michael Banzon

Antworten:

141

Beschreibung

Mit der Console.SetCursorPositionFunktion können Sie zu einer bestimmten Zeilennummer wechseln. Dann können Sie diese Funktion verwenden, um die Linie zu löschen

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

Stichprobe

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

Mehr Informationen

dknaack
quelle
Ich programmiere .NET seit ungefähr 8-9 Jahren ... also keine Panik. Lesen Sie Bücher, finden Sie die richtigen Personen, um Webcasts zu verfolgen und anzuzeigen.
dknaack
1
@badboy - Google / Bing + MSDN ist Ihr Online-Freund. Wenn Sie sich bei einer Methode nicht sicher sind, suchen Sie danach und versuchen Sie zuerst die MSDN-Antwort, um die offizielle Erklärung zu erhalten. Das Verständnis der API ist jedoch nur ein Teil der Programmierung ... Deshalb machen sie Kurse, Abschlüsse und es kann viel Übung erfordern ... Willkommen zu dem, was ich hoffe, dass Sie einen interessanten Weg finden.
Shaun Wilde
7
Dieser Code sollte wahrscheinlich Console.BufferWidthanstelle von verwendet werden Console.WindowWidth, da möglicherweise Zeichen außerhalb des sichtbaren Fensterbereichs geschrieben werden.
NathanAldenSr
Warum verursacht die Einnahme (Console.CursorTop - 1)keinen Fehler außerhalb des Bereichs? Ich schaue auf die C # -Quelle für SetCursorPosition und es sieht so aus, als würde 'int' verwendet, was die Zahl -1 ergeben würde. Ich sehe, dass es keine vorzeichenlose Ganzzahl verwendet. Warum wird also kein Fehler ausgegeben?
Der flauschige Roboter
@TheFluffyRobot, da Console.CursorTopdie aktuelle Zeile zurückgegeben wird, also Console.CursorTop - 1die vorherige Zeile. Da es eine Console.WriteLine("Test");vorher gibt, wird die aktuelle Zeile niemals 0 sein.
Magnetron
45

Eine einfachere und imho bessere Lösung ist:

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

Es verwendet den Wagenrücklauf , um zum Zeilenanfang zu gelangen, druckt dann so viele Leerzeichen wie die Konsole breit ist und kehrt wieder zum Zeilenanfang zurück, sodass Sie anschließend Ihren eigenen Test drucken können.

hellow
quelle
27
Für mich funktionierte es nur mit Console.WindowWidth-1: Console.Write("\r" + new string(' ', Console.WindowWidth - 1) + "\r");
Dorin
12

"ClearCurrentConsoleLine", "ClearLine" und die übrigen oben genannten Funktionen sollten Console.BufferWidth anstelle von Console.WindowWidth verwenden (Sie können sehen, warum, wenn Sie versuchen, das Fenster zu verkleinern). Die Fenstergröße der Konsole hängt derzeit von ihrem Puffer ab und kann nicht breiter sein. Beispiel (Dank geht an Dan Cornilescu):

public static void ClearLastLine()
{
    Console.SetCursorPosition(0, Console.CursorTop - 1);
    Console.Write(new string(' ', Console.BufferWidth));
    Console.SetCursorPosition(0, Console.CursorTop - 1);
}
User0123456789
quelle
Dies sollte normalerweise ein Kommentar zu den jeweiligen Posts sein, da die Frage nicht von selbst beantwortet wird.
Dan Cornilescu
7
Ich kann auf ihre Beiträge nicht antworten, wenn ich nicht genügend Ruf habe. Ich kann die Autoren der Kommentare nicht kontaktieren, da ich ihre E-Mails nicht gefunden habe und es keinen Sinn macht, dieselbe (nicht originale) Lösung in meiner Antwort zu spammen.
User0123456789
9

Das hat bei mir funktioniert:

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

Meine bevorzugte Methode ist die Verwendung von PadRight. Anstatt zuerst die Zeile zu löschen, wird der Rest der Zeile gelöscht, nachdem der neue Text angezeigt wurde, und es wird ein Schritt gespeichert:

Console.CursorTop = 0;
Console.CursorLeft = 0;
Console.Write("Whatever...".PadRight(Console.BufferWidth));
John
quelle
(BufferWidth -1)die Leitung nicht überlaufen lassen.
Riezebosch
2

Wir könnten einfach die folgende Methode schreiben

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

und nennen Sie es dann bei Bedarf so

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

Es funktioniert gut für mich.

Alec
quelle
1

Gehen Sie folgendermaßen vor, um von der aktuellen Position bis zum Ende der aktuellen Zeile zu wechseln:

    public static void ClearToEndOfCurrentLine()
    {
        int currentLeft = Console.CursorLeft;
        int currentTop = Console.CursorTop;
        Console.Write(new String(' ', Console.WindowWidth - currentLeft));
        Console.SetCursorPosition(currentLeft, currentTop);
    }
Jesse Chisholm
quelle
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);
    }
}
Pranav
quelle
3
Bitte erläutern Sie Ihre Antwort, damit sie für zukünftige Leser nützlich ist.
Prudhvi
0

Ich glaube, ich habe herausgefunden, warum es für diese Frage unterschiedliche Antworten gibt. Wenn die Größe des Fensters so geändert wurde, dass es eine horizontale Bildlaufleiste hat (da der Puffer größer als das Fenster ist), scheint Console.CursorTop die falsche Zeile zurückzugeben. Der folgende Code funktioniert für mich unabhängig von der Fenstergröße oder der Cursorposition.

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

Ohne (Console.WindowWidth> = Console.BufferWidth? 1: 0) kann der Code den Cursor je nach verwendeter Version auf dieser Seite und dem Status des Fensters entweder nach oben oder unten bewegen.

SomeNameNotFake
quelle