Try catch textbox vide [Résolu]

helpiste 4 Messages postés jeudi 31 décembre 2009Date d'inscription 2 janvier 2010 Dernière intervention - 31 déc. 2009 à 18:39 - Dernière réponse : nhervagault 6069 Messages postés dimanche 13 avril 2003Date d'inscription 15 juillet 2011 Dernière intervention
- 3 janv. 2010 à 14:55
Bonjour,

je développe des petites applications pour mieux apprendre le c#, et je me posais la question si existait une exception TRY CATCH qui gère la condition si un "textbox" est vide.

Exemple:
j'ai un FORM composer de plusieurs "textbox" et je voulais effectuer une opération seulement si tous mes textbox sont remplis.
j'ai essayé avec les "listbox" ,les if(textbox1.Text !="" ....), et autres méthodes et ça marche, Mais je m'interroge si y'a pas une autre alternative (genre try cath).

Peut être je suis naïf vu que je suis débutant, mais j'ai confiance en visual studio et comme on dit un bon programmeur est un programmeur feignant :) (j'ai la version 2008).

J'attends vos conseils.
Merci.
Afficher la suite 

9 réponses

Répondre au sujet
nhervagault 6069 Messages postés dimanche 13 avril 2003Date d'inscription 15 juillet 2011 Dernière intervention - 1 janv. 2010 à 16:29
+3
Utile
Salut,

Comme le nom l'indique les try catch et les exceptions sont fait pour des cas excepptionnel. (qui normalement ne devrait pas se produire)

Genre argument à null, division par zero, operation impossible.

Il faut eviter de gerer par une exception les controles de validité des saisie. Car les exceptions sont couteuse en mémoire et temps de calcul, recuperation de la stack ....

Pour ton cas, voici quelques méthodes à utiliser.

Tu est en windows forms,
la methode simple est de faire une boucle

foreach (Control ctrlButton in this.Controls)
{
  if (ctrlButton is TextBox && ctrlButton.Visible == true)
  {
    if(String.isNullOrEmpty(ctrButton as TextBox).Text)
    {
        MessageBox.Show(String.Format("Error on {0}",ctrButton.Name));
        break;//sortie pas propre sur le premier controle en erreur
    }
  }
}


Il est possible de passer par des errors provider
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de nhervagault
cs_casy 7745 Messages postés mercredi 1 septembre 2004Date d'inscription 24 septembre 2014 Dernière intervention - 31 déc. 2009 à 18:56
0
Utile
Dans la mesure où
- Il n'est pas possible de déterminer à l'avance combien de textbox tu mettra sur ton écran
- Il est probable qu'il n'y ai pas que des textbox sur ton écran
- Il peut être tout à fait normal qu'un textbox soit vide dans le contexte d'un logiciel quelconque
- .......
- .......
- .......

JE ne pense pas qu'une telle fonction existe. En tout cas, je ne la connais pas. Il faut donc que tu te code le test toi-même.

Ceci dit, si le fait qu'un de tes textbox soit vide provoque une exception dans le traitement que tu fais, un Try...Catch peut effectivement intercepter cette exception.
Mais un codage propre veut que dans ce cas, on ne laisse pas l'exception se lever, mais qu'au contraire, on vienne vérifier avant de lancer le traitement que les textbox nécessaires soient bien remplies.


[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
Commenter la réponse de cs_casy
helpiste 4 Messages postés jeudi 31 décembre 2009Date d'inscription 2 janvier 2010 Dernière intervention - 31 déc. 2009 à 19:51
0
Utile
C'est exactement ça, les conditions varient selon l'usage, donc j'opte souvent pour un codage ou je test moi même comme tu dis -casy-, mais j'avoue que des fois je bloque, par exemple j'ai une application ou j'ai 10 "textbox", l'utilisateur est obligé de tous remplir pour lancer une opération, sauf que y'a des utilisateurs qui ont accès à seulement 5 "textbox" et d'autres à 7 ou 8 ..., et au lieu de générer dynamiquement les textbox j'ai choisi (Mauvais choix :)) de jouer avec la visibilité dans les propriétés du contrôle, du coup j'arrive pas à standardiser mon test sachant que tous les "textbox" doivent être remplies puisque les contrôles invisibles je les remplis par défaut.
La je suis entrain de lire sur internet des docs sur les TRY CATH afin de bien captiver l'utilité. j'ai du chemin à faire :)
Merci
Commenter la réponse de helpiste
helpiste 4 Messages postés jeudi 31 décembre 2009Date d'inscription 2 janvier 2010 Dernière intervention - 1 janv. 2010 à 20:29
0
Utile
Merci nhervagault,
ça répond en grande partie à mes attentes, j'ai testé ta méthode et ça fonctionne afficacement.

je corrige rapidement le code pour les autres visiteurs :

foreach (Control ctrlButton in this.Controls)
            {
                if (ctrlButton is TextBox && ctrlButton.Visible == true)
                {
                    if (String.IsNullOrEmpty((ctrlButton as TextBox).Text))
                    {
                        MessageBox.Show(String.Format("Error on {0}", ctrlButton.Name));
                        break;//sortie pas propre sur le premier controle en erreur
                    }
                }
            }


Merci à tous Bonne Année 2010.
Commenter la réponse de helpiste
sawII 2 Messages postés samedi 2 janvier 2010Date d'inscription 3 janvier 2010 Dernière intervention - 2 janv. 2010 à 18:39
0
Utile
Bonjour,

je suis aussi débutant, je veux utiliser ce code mais ca marche pas quand mes textbox sont dans des groupbox, on dirait que la boucle parcourt les groupbox mais pas ce qui il y a dedans.

Comment faire svp.

Merci.
Commenter la réponse de sawII
helpiste 4 Messages postés jeudi 31 décembre 2009Date d'inscription 2 janvier 2010 Dernière intervention - 2 janv. 2010 à 23:17
0
Utile
Essaie ça -sawII-

foreach (Control ctrlButton in groupBox1.Controls)
            {
                if (ctrlButton is TextBox && ctrlButton.Visible == true)
                {
                    if (String.IsNullOrEmpty((ctrlButton as TextBox).Text))
                    {
                        MessageBox.Show(String.Format("Error on {0}", ctrlButton.Name));
                        break;//sortie pas propre sur le premier controle en erreur
                    }
                }
            }

Par contre je ne sais pas comment faire si y'a plusieurs groupbox, tu multiplies les tests en attendant que quelqu'un t'aide à tout mettre dans la même boucle, si c'est ça que tu veux.
salut.
Commenter la réponse de helpiste
sawII 2 Messages postés samedi 2 janvier 2010Date d'inscription 3 janvier 2010 Dernière intervention - 3 janv. 2010 à 00:10
0
Utile
Merci pour ta réponse.

ça marche, mais j'ai pas réussi avec plusieurs groupbox.

Merci,
Commenter la réponse de sawII
cs_casy 7745 Messages postés mercredi 1 septembre 2004Date d'inscription 24 septembre 2014 Dernière intervention - 3 janv. 2010 à 10:16
0
Utile
avec peut-etre la concaténation des 2 codes, non ?

foreach (Control ctrlButton in this.Controls)
{
  if (ctrlButton is TextBox && ctrlButton.Visible == true)
  {
    if(String.isNullOrEmpty(ctrButton as TextBox).Text)
    {
        MessageBox.Show(String.Format("Error on {0}",ctrButton.Name));
        break;//sortie pas propre sur le premier controle en erreur
    }
  }
  
  if (ctrlButton is GroupBox && ctrlButton.Visible == true)
  {
    foreach (Control ctrlButton2 in ctrlButton.Controls)
    {
      if (ctrlButton2 is TextBox && ctrlButton2.Visible == true)
      {
        if (String.IsNullOrEmpty((ctrlButton2 as TextBox).Text))
        {
           MessageBox.Show(String.Format("Error on {0}", ctrlButton2.Name));
           break;//sortie pas propre sur le premier controle en erreur
        }
      }
    }
  }
}


Evidemment ça ne traite que les textboxs directement sur l'écran ou dans des groupbox, eux-même directement sur l'écran
Pour traiter des textbox dans des panels, ou autres container, ou alors placer sur un 3eme niveau (panel dans un groubox, par exemple), plutot qe de dupliquer le code à l'infini, il faudrait envisager un code plus générique avec éventuellement une fonction récursive pour traiter l'ensemble des niveaux rencontrés



[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
Commenter la réponse de cs_casy
nhervagault 6069 Messages postés dimanche 13 avril 2003Date d'inscription 15 juillet 2011 Dernière intervention - 3 janv. 2010 à 14:55
0
Utile
Pour les groupbox et les panels ...
Il faut utiliser la récursivité, j'ai oublié de le préciser dans le message, j'ai posté trop vite ;-)

Avec la propriété hasChildren

Bon dev.
Commenter la réponse de nhervagault

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.