2011-10-28 24 views
10

¿Cómo puedo usar MaskedTextBox para evitar que el usuario ingrese una dirección IP no válida? (Quiero que se comporte como el de Windows).Dirección IP en un MaskedTextBox?

+0

¿Por qué no solo lee el valor y le ahorra al usuario algunos problemas? Nunca haga que un usuario haga lo que puede hacer por ellos. – Woot4Moo

Respuesta

14

Prueba esto:

IPAddress ipAddress; 
if (IPAddress.TryParse(maskedTextBoxY.Text, out ipAddress)) 
{ 
    //valid ip 
} 
else 
{ 
    //is not valid ip 
} 

nota: para usarlo , necesita importar el espacio de nombres System.Net:

using System.Net; 
4

Es mejor utilizar REGEX para validar la entrada del usuario. He aquí un ejemplo:

  string pattern = @"\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b"; 

     string ip1 = "192.168.0.1"; 
     string ip2 = "302.0.0.1"; 

     Regex.IsMatch(ip1, pattern); // returns true 
     Regex.IsMatch(ip2, pattern); // returns false 
+7

y ahora tiene dos problemas ... – Woot4Moo

+0

Um, ¿desde cuándo? Esto no responde la pregunta en absoluto. -1 – Ryan

+1

@minitech - Creo que Woot4Moo se está refiriendo a esa antigua sierra sobre expresiones regulares - vea http://www.codinghorror.com/blog/2008/06/regular-expressions-now-you-have-two-problems.html –

1

Establecer la máscara para: ###.###.###.###

mostrará así:

enter image description here

+0

y qué de IPv6? – Woot4Moo

+0

@ Woot4Moo No creo que se pueda hacer con una sola máscara. Tendrá que escuchar la tecla presionada y manejar los caracteres que no están permitidos – Icarus

+0

Correcto, MaskedTextBox no le permite hacer validaciones complejas directamente. Puede usar el evento KeyPress para leer la entrada del usuario y determinar que es válido. Y una expresión Regex correcta ayuda a hacer esta tarea. – Dan

13

mucho más simple que las otras respuestas:

Uso System.Net.IPAddress y System.Windows.Forms.MaskedTextBox

establezca las siguientes propiedades de la MaskedTextBox:

MaskedTextBox.Mask = ###.###.###.### 
MaskedTextBox.ValidatingType = typeof(System.Net.IPAddress); 

cada vez que se valida el cuadro de texto, se genera el evento MaskedTextBox.TypeValidationCompleted. Los argumentos del evento muestran lo siguiente:

  • ¿El texto mecanografiado es aceptable como dirección IP? (= Hace System.Net.IPAddress.TryParse volver ok)
  • descripción del error como una cadena
  • El valor analizado (= un objeto de System.Net.IPAddress
  • El tipo del valor analizado. Necesarias si tiene varios MaskedTextBoxes con diferentes máscaras

Tras la recepción de este evento se puede decidir si se debe utilizar el valor o notificar al usuario de lo que está mal con el valor.

+1

NO funciona. Solo funciona para 123.123.123.123 - es decir, TODOS los caracteres están presentes. La dirección IP de "123.4.5.6" aparecerá como "123.456 .." –

+0

Suscríbete al evento KeyDown y reacciona de la manera que quieras que sea la entrada si el operador presiona un punto/punto y coma/coma/flecha derecha/pestaña, etc. –

0

no hay una solución compleja para esta pregunta todavía. Creo que la respuesta de @HaraldDutch es la más cercana, pero es no prevet de entrada con carácter de espacio. Usando la instrucción adicional:

IPAdressBox.ResetOnSpace = false; 

problema generaly resuelto, pero más complejo es poner en práctica los datos personalizados propios typewith método de análisis.

  public class IPValidator 
      { 
       public static IPValidator Parse(string input) 
       { 
        Regex regexpr = new Regex(@" "); 
        Match match = regexpr.Match(input); 
        if (match.Success) 
         return new IPValidator(); 
        else throw new ArgumentException(input); 
       } 
      } 

Donde regexpr es expresión específica para validar IP. Después de que se puede utilizar como ValidatingType:

IPAdressBox.ValidatingType = typeof(IPValidator); 
0

hice un cuadro de texto enmascarado IP que imita la de Windows uno.

Tiene el mismo ancho y alto, impide que los usuarios entren> 255 valores, saltos de cajas, etc., etc. Si todavía lo necesita y desea probarlo está aquí:

https://github.com/RuvenSalamon/IP-MaskedTextBox

(no sé si esto cuenta como la auto-promoción, pero es de código abierto por lo que supongo que está bien.)