IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

Distinguer les FormatException dans l'event DataError d'un DataGridView


Sujet :

Windows Forms

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 9
    Points : 5
    Points
    5
    Par défaut Distinguer les FormatException dans l'event DataError d'un DataGridView
    Bonjour à tous,

    actuellement je tente de réaliser un sorte de template pour le composant dataGridView en C#.

    C'est-à-dire, essayer de gérer dès le départ le maximum de message d'erreur "générique", en implémentant un panel d'erreur représentatif (format date, format int, format float, not null, not empty, without numeric, etc...).

    Pour commencer je souhaite gérer le maximum d'erreur via la bdd. Par exemple, gérer les erreurs FormatException en fonction de type de données.

    Mais je ne vois pas comment distinguer les différents format exception levée. On peut avoir une FormatException, parce que l'on saisi un alphanumérique à la place dans un champ int, mais aussi lorsqu'on attend un dateTime.

    Et je souhaiterais les distinguer pour pouvoir lever un message du type:
    "Veuillez saisir un entier pour le champ 'dataGridView1.Columns[e.ColumnIndex].HeaderText'"
    ou
    "Veuillez saisir un numérique pour ...."
    ou
    "Veuillez saisir une date pour ...."

    On pourrait les distinguer en regardant quelle méthode lève cette FormatException dans la StackTrace retournée...

    par ex: if (e.InnerException.StackTrace.Contains('System.Number.ParseInt32'))

    ...mais la méthodologie ne me semble pas bonne.

    Quelqu'un aurait-il une idée ???

    Merci pour vos réponses.

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 64
    Points : 62
    Points
    62
    Par défaut
    Bonjour,

    Tu peux simplement utiliser un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Try
    {
                  Ton appel de fonction
    }
    catch (Exception Ex)
    {
                  MessageBox.Show(Ex.Message);
    }
    dans ton UI et dans la fonction faire un test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if (NombreDeTruc..GetType() != typeof(int))
                  throw new ArgumentException ("Veuillez saisir un numérique pour NombreDeTruc");
    N'oublie pas de faire un finally si tu as une connexion ouverte, parce que le throw interromps directement a fonction et si ton code de fermeture est plus loin...


    Edit: erf non c'est pas ce que tu demandes en fait :s
    Entre la culture des perles fines et ceux qui perlent l'inculture, un point commun domine : c'est le QI de l'huître !

  3. #3
    Membre émérite
    Avatar de laedit
    Homme Profil pro
    Consultant études et développement
    Inscrit en
    Décembre 2006
    Messages
    1 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant études et développement
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 344
    Points : 2 265
    Points
    2 265
    Par défaut
    C'est une solution, mais ça va être horriblement lent.

    Plutôt que de passer par des Exceptions, il te suffit effectivement de faire des tests sur les types attendus et les types réels de tes variables.

    Le problème étant que comme tu ne sais pas exactement quelle cellule à déclenchée l'événement, tu es obligée de faire une boucle pour toutes les tester et définir un message d'erreur en fonction.
    Blog - Articles - Framework

    MSDN vous aide, si si, alors n'hésitez pas à y faire un tour avant de poser une question.
    Ah, et n'oubliez pas, Google peut répondre à la majorité de vos questions.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Tout d'abord merci pour la réponse.

    Mais ce n'est pas tout à fait ce que je recherche à faire, car dans ce cas, il me faudra implémenter le fait que telle colonne est de tel type, et telle autre colonne est de tel autre type.

    Alors que je cherche à le déduire directement des types de la base de données.

    Dans l'event dataGridView_DataError() le variable de type DataGridViewDataErrorEventArgs me renvoi une FormatException et je cherche à distinguer les différents type d'exception de formattage qu'elle me renvoi.

    Tout ceci, dans le but d'être le plus générique possible, en nécessitant le moins d'implémentation spécifique pour ce composant de type "template".

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Sinon pour respecter l'esprit "template" que je recherche j'ai penser à une autre solution:

    Utiliser le nom de chaque cellule du dataGridView en le formattant pour expliciter chacune des contrainte reposant sur la cellule. Par exemple: nomCell_NOTNULL_NOTEMPTY_INT.

    Du coup en testant le nom de la cellule, je pourrais déduire les tests de validation à effectuer dessus et en me servant du headerText pour connaitre le nom de cellule à afficher dans le message d'erreur.

    Mais de cette manière j'effectue toute ma validation de donnée par du code métier, alors que je me dis que le 'must' serait d'utiliser le maximum de contrainte exprimée par l'implémentation de la base de données.....

    Je ne sais pas si j'explicite bien ce que je recherche ???

  6. #6
    Membre émérite
    Avatar de laedit
    Homme Profil pro
    Consultant études et développement
    Inscrit en
    Décembre 2006
    Messages
    1 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant études et développement
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 344
    Points : 2 265
    Points
    2 265
    Par défaut
    Bah le mieux serait de récupérer la structure de la base de données et de la stocker quelque part pour pouvoir ensuite l'utiliser lors de tests suivant la FormatException.

    Un des moyens de stockage serait effectivement de les mettre dans les headers.
    Blog - Articles - Framework

    MSDN vous aide, si si, alors n'hésitez pas à y faire un tour avant de poser une question.
    Ah, et n'oubliez pas, Google peut répondre à la majorité de vos questions.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Et comment peut-on récupérer la structure de la base de données en C# ???

    (désolé je commence tout juste le c#)

  8. #8
    Membre émérite
    Avatar de laedit
    Homme Profil pro
    Consultant études et développement
    Inscrit en
    Décembre 2006
    Messages
    1 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant études et développement
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 344
    Points : 2 265
    Points
    2 265
    Par défaut
    Là, c'est plus du C#, c'est du SQL

    Il te suffit de faire une requête et de l'exécuter pour récupérer les données que tu veux. Par contre, ça va nécessiter une connexion à la base de données, donc il faut connaître le chaîne de connexion et la syntaxe SQL peut changer selon le type de base de données (SQL server, MySQL, etc...)
    Blog - Articles - Framework

    MSDN vous aide, si si, alors n'hésitez pas à y faire un tour avant de poser une question.
    Ah, et n'oubliez pas, Google peut répondre à la majorité de vos questions.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 64
    Points : 62
    Points
    62
    Par défaut
    Citation Envoyé par laedit Voir le message
    donc il faut connaître le chaîne de connexion et la syntaxe SQL peut changer selon le type de base de données (SQL server, MySQL, etc...)
    Pour ça tu trouveras ton bonheur ici .
    Entre la culture des perles fines et ceux qui perlent l'inculture, un point commun domine : c'est le QI de l'huître !

  10. #10
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Oualalala et comment qu'on fait quand les données viennent pas de la base ?

    La DataGridViewColumn connaît déjà le type de la propriété à laquelle elle est bindée : c'est sa propriété ValueType.
    ಠ_ಠ

  11. #11
    Membre émérite
    Avatar de laedit
    Homme Profil pro
    Consultant études et développement
    Inscrit en
    Décembre 2006
    Messages
    1 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant études et développement
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 344
    Points : 2 265
    Points
    2 265
    Par défaut
    Citation Envoyé par Guulh Voir le message
    La DataGridViewColumn connaît déjà le type de la propriété à laquelle elle est bindée : c'est sa propriété ValueType.
    Ah mince, je suis passé à côté de cette propriété
    Blog - Articles - Framework

    MSDN vous aide, si si, alors n'hésitez pas à y faire un tour avant de poser une question.
    Ah, et n'oubliez pas, Google peut répondre à la majorité de vos questions.

Discussions similaires

  1. alterner les couleurs dans un tableau avec xsl
    Par Eithelgul dans le forum XSL/XSLT/XPATH
    Réponses: 14
    Dernier message: 03/05/2015, 23h29
  2. Réponses: 0
    Dernier message: 12/04/2014, 22h32
  3. Powerpoint Events (les évènements dans Powerpoint)
    Par DPhBxl dans le forum Powerpoint
    Réponses: 1
    Dernier message: 03/09/2008, 16h42
  4. Réponses: 9
    Dernier message: 06/11/2007, 12h36
  5. gérer les jpg dans une fenetre directdraw???
    Par Anonymous dans le forum DirectX
    Réponses: 1
    Dernier message: 14/06/2002, 13h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo