2009-10-31 4 views
12

¿Cómo se puede establecer un valor de entrada predeterminado en una aplicación de consola .net?¿Cómo establecer el valor de entrada predeterminado en la aplicación .Net Console?

Aquí está algo de fantasía código:

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

Por supuesto, no espero que sea tan sencillo. Estoy apostando a tener que hacer algunas cosas de bajo nivel, no administradas; Simplemente no sé cómo.

EDITAR

Sé que puedo reemplazar ninguna entrada con el valor predeterminado. Eso no es lo que estoy preguntando. Estoy tratando de APRENDER lo que implica el logro del comportamiento que describí: darle al usuario un valor predeterminado editable. Tampoco me preocupa la validación de entrada; mi pregunta no tiene nada que ver con eso.

+0

Usted puede codificar esto como la respuesta sugirió - el usuario no se preocupan por la técnica de codificación. Para la pregunta teórica si hay una manera de hacerlo con readline, probablemente no (al menos no documentado). – Dani

+0

Pero, veo que intentabas ir, estamos buscando una solución que permita al usuario cambiar el texto predeterminado. – Dani

+0

Sé que no se puede hacer con .ReadLine(). Pero, sé que hay una manera de hacer esto. –

Respuesta

5

creo que va a tener administrar de forma manual por escuchar a cada pulsación de tecla:

thown rápidamente juntos ejemplo:

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

Esto es muy involucrada - que tendrá que mantener a garantizar el cursor no ir fuera de cobertura y actualizar manualmente el búfer.

+0

No creo que esto sea lo que significa la pregunta. – driis

+0

En realidad, esta es definitivamente la mejor respuesta hasta el momento. –

+0

Tírelo a un método de extensión para poder llamar a Console.ReadLine ("135"); ¿Los métodos de extensión pueden ser sobrecargas de métodos existentes? Si no, dale un nuevo nombre. – CoderDennis

3

O ... Simplemente pruebe el valor introducido, si está vacío ponga el valor predeterminado en la entrada.

+0

para que se vea mejor: puede usar una propiedad y agregarla al setter .... – Dani

1

solución simple, si las entradas del usuario nada, asignar el valor por defecto:

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

Cuando se trata de entradas del usuario, usted debe esperar que puede contener errores. Lo que podría utilizar TryParse con el fin de evitar una excepción, si el usuario no tiene un número de entrada:

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

esto sería considerado las mejores prácticas para el manejo de la entrada del usuario. Si necesita analizar muchas entradas de usuario, use una función auxiliar para eso. Una forma de hacerlo es usar un método con un valor nulo y devolver nulo si el análisis falló. Entonces es muy fácil de asignar un valor predeterminado mediante el 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; 
    } 
} 

Entonces, para leer una entrada y asignar un valor por defecto es tan fácil como:

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

Dejó su parámetro ficticio en 'ReadLine' en su lugar. –

+0

@ Adam, gracias por señalarlo, respuesta editada. – driis

0

Puede utilizar método de ayuda como esto:

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

Aquí es una solución simple:

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

No está completo sin embargo. Algunos caracteres en la cadena de entrada SendWait tienen un significado especial por lo que debe escaparse (por ej., +, (,), Etc.) Consulte: http://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.aspx para obtener una descripción completa.

2
  1. Agregar referencia a "System.Windows.Forms" Biblioteca de la Asamblea a su proyecto
  2. Añadir SendKeys.SendWait ("DefaultText") inmediatamente después de su comando Console.WriteLine y antes de su consola.comando ReadLine

 

string _weeklycost = ""; 
Console.WriteLine("Enter weekly cost: "); 
System.Windows.Forms.SendKeys.SendWait("135"); 
_weeklycost = Console.ReadLine(); 
Cuestiones relacionadas