2009-10-31 19 views
12

Jak ustawić domyślną wartość wejściową w aplikacji konsoli .net?Jak ustawić domyślną wartość wejściową w aplikacji .Net Console?

Oto udawanie Kod:

Console.Write("Enter weekly cost: "); 
string input = Console.ReadLine("135"); // 135 is the default. The user can change or press enter to accept 
decimal weeklyCost = decimal.Parse(input); 

Oczywiście, że nie należy się spodziewać, że będzie to proste. Obstawiam, że muszę zrobić coś niskiego, niezarządzanego; Po prostu nie wiem jak.

EDIT

wiem, że mogę zastąpić żaden sygnał z domyślnym. Nie o to pytam. Próbuję nauczyć się, co jest zaangażowane w osiągnięcie opisanego zachowania, dając użytkownikowi edytowalną wartość domyślną. Nie martwię się także o walidację danych wejściowych; moje pytanie nie ma z tym nic wspólnego.

+0

można zakodować to jako odpowiedź zasugerował - użytkownik nie będzie dbać o techniki kodowania. Dla teoretycznego pytania, czy istnieje sposób, aby to zrobić z readline - prawdopodobnie nie (przynajmniej nie udokumentowane). – Dani

+0

Ale - widzę, że próbujesz iść, szukamy rozwiązania, które umożliwi użytkownikowi zmianę domyślnego tekstu. – Dani

+0

Wiem, że nie można tego zrobić z .ReadLine(). Ale wiem, że jest sposób na zrobienie tego. –

Odpowiedz

5

wierzę, że trzeba będzie zarządzać tym ręcznie przez słuchanie każdym naciśnięciu klawisza:

Szybko thown razem przykład:

// write the initial buffer 
    char[] buffer = "Initial text".ToCharArray(); 
    Console.WriteLine(buffer); 

    // ensure the cursor starts off on the line of the text by moving it up one line 
    Console.SetCursorPosition(Console.CursorLeft + buffer.Length, Console.CursorTop - 1); 

    // process the key presses in a loop until the user presses enter 
    // (this might need to be a bit more sophisticated - what about escape?) 
    ConsoleKeyInfo keyInfo = Console.ReadKey(true); 
    while (keyInfo.Key != ConsoleKey.Enter) 
    { 

     switch (keyInfo.Key) 
     { 
      case ConsoleKey.LeftArrow: 
        ... 
       // process the left key by moving the cursor position 
       // need to keep track of the position in the buffer 

     // if the user presses another key then update the text in our buffer 
     // and draw the character on the screen 

     // there are lots of cases that would need to be processed (backspace, delete etc) 
     } 
     keyInfo = Console.ReadKey(true); 
    } 

To dość zaangażowany - musisz zachować zapewnić kursor nie wykracza poza zakres i ręcznie zaktualizować bufor.

+0

Nie sądzę, że to właśnie ma na myśli pytanie. – driis

+0

Obecnie jest to zdecydowanie najlepsza odpowiedź. –

+0

Przerzuć to do metody Extension, aby móc wywołać Console.ReadLine ("135"); Czy metody rozszerzania mogą być przeciążeniem istniejących metod? Jeśli nie, nadaj mu nową nazwę. – CoderDennis

3

Lub ... Po prostu przetestuj wprowadzoną wartość, jeśli jest pusta, wprowadź wartość domyślną na wejściu.

+0

, aby wyglądał lepiej - możesz użyć właściwości i dodać ją do ustawiacza ... – Dani

1

Proste rozwiązanie, jeśli dane wprowadzane przez użytkownika niczego przypisywać domyślne:

Console.Write("Enter weekly cost: "); 
string input = Console.ReadLine(); 
decimal weeklyCost = String.IsNullOrEmpty(input) ? 135 : decimal.Parse(input); 

Gdy mamy do czynienia z wejściami użytkownika, należy oczekiwać, że może on zawierać błędy. Więc można używać TryParse w celu uniknięcia wyjątek, jeśli użytkownik nie posiada wejścia numer:

Console.Write("Enter weekly cost: "); 
string input = Console.ReadLine(); 
decimal weeklyCost; 
if (!Decimal.TryParse(input, out weeklyCost)) 
    weeklyCost = 135; 

To byłoby uznane za najlepsze praktyki przenoszenia danych wprowadzanych przez użytkownika. Jeśli chcesz przeanalizować wiele danych wejściowych użytkownika, użyj do tego funkcji pomocnika. Jednym ze sposobów jest użycie metody z wartością zerową i zwracanie wartości null, jeśli analiza nie powiodła się. To jest bardzo łatwe do przypisania wartości domyślnej za pomocą null coalescing operator:

public static class SafeConvert 
{ 
    public static decimal? ToDecimal(string value) 
    { 
     decimal d; 
     if (!Decimal.TryParse(value, out d)) 
      return null; 
     return d; 
    } 
} 

Następnie, aby odczytać dane wejściowe i przypisać wartość domyślną jest tak proste, jak:

decimal d = SafeConvert.ToDecimal(Console.ReadLine()) ?? 135; 
+0

Zostawiłeś swój fikcyjny parametr "ReadLine" w miejscu. –

+0

@Adam, dzięki za wskazanie, że odpowiedź edytowana. – driis

0

Można użyć metody pomocnika jak to:

public static string ReadWithDefaults(string defaultValue) 
{ 
    string str = Console.ReadLine(); 
    return String.IsNullOrEmpty(str) ? defaultValue : str; 
} 
6

Oto proste rozwiązanie:

public static string ConsoleReadLineWithDefault(string defaultValue) 
{ 
    System.Windows.Forms.SendKeys.SendWait(defaultValue); 
    return Console.ReadLine(); 
} 

To nie jest jednak ukończyć. Niektóre znaki w łańcuchu wejściowym SendWait mają specjalne znaczenie, więc musisz uciec przed nimi (np. +, (,) Itd.) Zobacz pełny opis: http://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.aspx.

2
  1. Add Reference Library Zgromadzenie "System.Windows.Forms" do projektu
  2. Dodaj SendKeys.SendWait ("DefaultText") niezwłocznie po komendzie Console.WriteLine i przed konsolą.ReadLine komenda

 

string _weeklycost = ""; 
Console.WriteLine("Enter weekly cost: "); 
System.Windows.Forms.SendKeys.SendWait("135"); 
_weeklycost = Console.ReadLine(); 
Powiązane problemy