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.Clear
funktioniert 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.
Antworten:
Beschreibung
Mit der
Console.SetCursorPosition
Funktion können Sie zu einer bestimmten Zeilennummer wechseln. Dann können Sie diese Funktion verwenden, um die Linie zu löschenpublic 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
quelle
Console.BufferWidth
anstelle von verwendet werdenConsole.WindowWidth
, da möglicherweise Zeichen außerhalb des sichtbaren Fensterbereichs geschrieben werden.(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?Console.CursorTop
die aktuelle Zeile zurückgegeben wird, alsoConsole.CursorTop - 1
die vorherige Zeile. Da es eineConsole.WriteLine("Test");
vorher gibt, wird die aktuelle Zeile niemals 0 sein.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.
quelle
Console.Write("\r" + new string(' ', Console.WindowWidth - 1) + "\r");
"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); }
quelle
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); }
quelle
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));
quelle
(BufferWidth -1)
die Leitung nicht überlaufen lassen.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.
quelle
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); }
quelle
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); } }
quelle
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.
quelle