Controle textbox pour la saisie d'adresse ip.

Description

Dans un projet je suis emmené à demander à l'utilisateur d'entrer une adresse IP et un port.
A chaque fois, je faisais toujours la même manipulation pour la partie graphique et la validation de l'adresse.
Je me suis dis qu'il serait peut être plus intelligent de créer mon propre composant que j'utiliserai lorsque j'en aurais besoin.

Ce controle permet de présenter à l'utilisateur une zone de saisie d'adresse IP et un port.
La validité des valeurs est contrôlée durant la frappe et après la frappe.
L'adresse IP entrée peut être récupérée au format String, byte[] ou IPAddress.
On peut, en utilisant ces même formats, remplir la partie adresse IP.

La saisie de l'adresse IP est aider avec des déplacement du focus automatique.

Source / Exemple :


//Voici certaines fonctions utilisées pour controlé la validité de l'adresse
//ainsi que la fonction et variable pour récupérer et assigné la valeur.

/// <summary>
/// Variable permettant de définir ou de récupérer l'adresse
/// IP du composant au format String
/// </summary>
public String stringIP
{
	set
	{
		try
		{
			String[] txtIp = value.Split(new char[1]{'.'});
			textBox1.Text = txtIp[0];
			textBox2.Text = txtIp[1];
			textBox3.Text = txtIp[2];
			textBox4.Text = txtIp[3];
		}
		catch
		{
			throw new Exception(string.Format("La valeur donnée n'est pas valide.")); 
		}
	}
	get
	{
		return getIPInString();
	}
}

/// <summary>
/// Cette fonction teste si il la valeur du texBox sender
/// est correcte.
/// Si oui, on laisse changer de controle.
/// Sinon, on reste sur ce controle et on selectionne le texte.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void IPTextBoxLeave(object sender, System.EventArgs e)
{
	if(((TextBox)sender).Text == "") return;
	if(!IsNumeric(((TextBox)sender).Text))
	{
		((TextBox)sender).Focus();
		((TextBox)sender).SelectAll();
		return;
	}
	else
	{
		int value = Convert.ToInt32(((TextBox)sender).Text);
		if((value<0) || (value>255))
		{
			((TextBox)sender).Focus();
			((TextBox)sender).Select(0,((TextBox)sender).Text.Length);
			return;
		}
	}
}

/// <summary>
/// Fonction appelée à l'appuis d'une touche clavier.
/// Elle teste la validitée de cette dernière avant de l'inscrire.
/// Si elle est correcte, on laisse la touche s'exécuter.
/// Sinon, on l'inhibe.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void textBoxKeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
	// Si la caractère tapé est numérique
	if (char.IsNumber(e.KeyChar))
	{
		if (e.KeyChar == '²') e.Handled = true; // Si c'est un '²', on gère l'evenement.
		else e.Handled = false; // Sinon, on laisse passer le caractère (On peut omettre cette ligne)
       	}
	// Si le caractère tapé est un caractère de "controle" (Enter, backspace, ...), on laisse passer
	else if (char.IsControl(e.KeyChar)) 
	{
		if(e.KeyChar == Convert.ToChar(8)&& ((TextBox)sender).Text.Length ==0 )
		{
			//si touche suppr et textbox vide,on passe au précédent
			this.SelectNextControl((TextBox)sender,false,false,false,true);
		}
		e.Handled = false;
	}
	// Si on appuit sur '.', on passe à l'autre nombre de l'IP (sauf dernier nombre et le port )
	else if (e.KeyChar == '.' && !((TextBox)sender).Equals(textBox5) && !((TextBox)sender).Equals(textBox4))
	{
		//on ne passe au suivant que sur le textBox n'est pas vide
		if(((TextBox)sender).Text.Length > 0 ) 
			this.SelectNextControl((TextBox)sender,true,false,false,true);
		e.Handled = true;
	}
	// si on demande le numéro du port avec la touche :
	else if(e.KeyChar == ':' && ((TextBox)sender).Equals(textBox4))
	{
		this.SelectNextControl((TextBox)sender,true,false,false,true);
		e.Handled = true;
	}
	// Et sinon, on gère toutes les autres touches tapées, et on en fait rien
	else e.Handled = true;
}

/// <summary>
/// Fonction appelée lorsque la valeur du textBox sender est modifiée.
/// Elle est donc appelé généralement après un textBoxKeyPress.
/// Elle ne teste que la longueur du texte, supposant sa valeur correcte.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void IPTextBoxTextChanged(object sender, System.EventArgs e)
{
	// si le textBox n'est pas vide et est un nombre
	if(((TextBox)sender).Text.Length != 0 && IsNumeric(((TextBox)sender).Text))
	{
		//on supprime les zéros inutiles en début de nombre
		String txt = ((TextBox)sender).Text;
		((TextBox)sender).Text = Convert.ToInt32(txt).ToString();
		txt = ((TextBox)sender).Text;
		//on se place à la fin de la saisie
		((TextBox)sender).Select(txt.Length,0);
		//si on a 3 chiffres, on passe au controle suivant
		if(((TextBox)sender).Text.Length == 3)
			this.SelectNextControl((TextBox)sender,true,false,false,true);
		if(((TextBox)sender).Text.Length > 3)
			((TextBox)sender).Text = ((TextBox)sender).Text.Remove(5,((TextBox)sender).Text.Length-3);
	}
	else
	{
		((TextBox)sender).Focus();
		((TextBox)sender).Select(0,((TextBox)sender).Text.Length);
	}
}

/// <summary>
/// Fonction permettant de connaitre l'IP au format String
/// </summary>
/// <returns>IP entrée au format String</returns>
public string getIPInString()
{
	if(textBox1.Text.Length !=0 && 
	   textBox2.Text.Length !=0 &&
	   textBox3.Text.Length !=0 && 
	   textBox4.Text.Length !=0)
	{
		return textBox1.Text + "." + textBox2.Text + "." + textBox3.Text + "." + textBox4.Text;
	}
	else throw new Exception(string.Format("Au moins une des valeurs de l'IP est vide.")); 
}

Conclusion :


Ce qu'il reste a faire:
- supprimer les bugs que vous trouverez :)
- redessiner les éléments du controle lorsqu'on redimentionne ce dernier (dans le rezize du controle)

Mise à jour:
- dès qu'un bug sera signalé ou que j'aurai rencontré
- tant que je programmerai

J'ai réalisé ce controle à partir de recherche sur le forum, je vous remercie donc.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.