Controle textbox pour la saisie d'adresse ip.

Soyez le premier à donner votre avis sur cette source.

Vue 24 383 fois - Téléchargée 3 674 fois

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

Ajouter un commentaire

Commentaires

cs_badrbadr
Messages postés
475
Date d'inscription
jeudi 19 juin 2003
Statut
Membre
Dernière intervention
3 novembre 2008
-
c'est drôle, j'aurais parier qu'un côntrole existe déjà dans la toolbox .net :) mmm, c'était peut-être en MFC
sinon, il y a toujours le masked textbox (beaucoup moins beau visuellement que ton contrôle :) qui peut ± faire la job.

ton code est bien commenté
bravo
cs_coq
Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
75 -
Eh bah visiblement c'était du .Net 2.0, donc tu vas pouvoir l'utiliser l'attribut DisplayName :p

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.