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

VB.NET Discussion :

Surcharger la méthode ToString du type Boolean


Sujet :

VB.NET

  1. #1
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut Surcharger la méthode ToString du type Boolean
    Hello,

    Tout est dans le titre. Dans une application, je voudrais surcharger cette méthode pour que je puisse montrer à l'utilisateur (via un datagridview) la valeur d'une variable de type Boolean via la méthode ToString.

    Il est évident que l'utilisateur ne va pas comprendre True et False.

    Certains me diront d'utiliser des cellules checkbox pour afficher ces valeurs mais mes users sont neuneus et veulent toujours cliquer sur ces cases pour tenter de modifier ces valeurs (et d'autres ne comprennent carrément pas que quand c'est coché, ça veut dire oui... )

    Vu que le datagridview utiliser la méthode ToString des objets contenus dans ses colonnes pour afficher les valeurs, je souhaite donc surcharger la méthode ToString de Boolean pour afficher Oui et Non.

    Si je sais comment surcharger une méthode d'une classe perso, aucune idée de comment faire sur une classe existante... :-/

  2. #2
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Billets dans le blog
    3
    Par défaut
    Pour surcharger, tu dois créer un type dérivé de Boolean. Sinon, il y a d'autres solutions :
    1. Créer une méthode d'extension spécifique qui retournera oui/non
    2. Créer un formatter spécifique (et l'utiliser en intervenant au moment du binding/création de la ligne)
    3. Utiliser les deux conjointement

    Pour l'option n°2, voici un exemple de code :
    Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    Public Class CustomBooleanFormatter
    	Implements IFormatProvider
    	Implements ICustomFormatter
     
    	Public Function Format(format__1 As String, arg As Object, formatProvider As IFormatProvider) As String
    		Dim value = CBool(arg)
    		format__1 = (If(format__1 IsNot Nothing, format__1.Trim().ToLower(), Nothing))
     
    		Select Case format__1
    			Case "on"
    				Return If(value, "Oui", "Non")
    			Case Else
    				If TypeOf arg Is IFormattable Then
    					Return DirectCast(arg, IFormattable).ToString(format__1, formatProvider)
    				Else
    					Return arg.ToString()
    				End If
    		End Select
    	End Function
     
    	Public Function GetFormat(formatType As Type) As Object
    		If formatType = GetType(ICustomFormatter) Then
    			Return Me
    		Else
    			Return Nothing
    		End If
    	End Function
    End Class
    Pour l'utiliser :
    Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim ouinon = String.Format(New CustomBooleanFormatter(), "TRUE: {0:ON} ; FALSE: {1:ON}", True, False)
    Pour utiliser la méthode d'extension avec le custom formatter, voici le code de la méthode d'extension :
    Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Public NotInheritable Class CustomExtensions
     
    	Private Sub New()
    	End Sub
     
    	<System.Runtime.CompilerServices.Extension> _
    	Public Shared Overloads Function ToString(value As Boolean, format As String) As String
    		Return String.Format(New CustomBooleanFormatter(), "{0:" & format & "}", value)
    	End Function
    End Class
    Et pour l'utiliser :
    Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim oui = True.ToString("ON")
    Dim non = False.ToString("ON")
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  3. #3
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Ah bah put***, jamais je n'aurais pondu un truc pareil par moi-même.

    Y a tellement de nouveaux trucs pour moi que je pige pas tout . Du coup, si ce n'est pas trop demandé (et si t'as le temps), tu pourrais un peu détailler ?

    C'est possible de passer un paramètre en plus pour dire dans quelle langue je veux ce Oui/Non ? XD

    Petite paranthèse mais toujours liée à l'affichage dans un datagridview :
    Pour les types par références (disons le type Date), que se passe-t-il si j'ai une classe avec une propriété de type Data valant Nothing et que je l'affiche dans un datagridview ?
    1. Vais-je me ramasser une NullReferenceException ?
    2. Est-ce que le dgv est assez malin pour savoir qu'il ne doit pas appeler ToString sur un objet qui n'existe pas ?
    3. Affiche-t-il une chaîne vide ?
    4. Affiche-t-il un texte (autre qu'une chaîne vide) indiquant que l'objet n'existe pas ?


    Dans l'hypothèse 4, il est évident que le texte ne doit pas être vu par l'utilisateur... Serait-il possible de surcharger ce texte ? Vu que l'objet n'existe pas, ce n'est pas la méthode Date.ToString qu'il faut surcharger. Mais quoi alors ?

    P.S. : Je dois avoir un don pour penser à toutes ces questions tordues

  4. #4
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Billets dans le blog
    3
    Par défaut
    Par défaut le DGV ne va rien afficher dans le cas où il y a une valeur NULL.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  5. #5
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Sauf qu'en fait, quand on met un type date (ou datetime) à nothing, il y a 01/01/0001 00:00:00.0000 (enfin qqch du genre XD)

    Du coup bah... j'ai fait un wrapper en linq. Pareil pour mon problème de text de booléén. En plus ça m'a permis de faire découvrir les types anonymes à mon collègue.

    Désolé pour le dérangement .

    N'empêche, je vais quand même creuser ces méthodes d'extension. Ca a l'air intéressant.

  6. #6
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 194
    Par défaut
    il y a aussi beaucoup plus simple, l'event CellFormating du dgv, qui permet de modifier ce qui va être affiché en 2 lignes de code
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    il y a aussi beaucoup plus simple, l'event CellFormating du dgv, qui permet de modifier ce qui va être affiché en 2 lignes de code
    Chut ! Viens pas casser tout mon travail pédagogique !

    (sinon, je crois que je n'ai pas encore utiliser cet event ^^)

  8. #8
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 194
    Par défaut
    certes mais si tu ne mets que de ca dans ton projet, tu vas te retrouver avec 10x plus que le code suffisant, et donc une perte de maintenabilité
    après sur des gros projets ou sur des choses complexes, utiliser une usine à gaz je ne suis pas contre
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  9. #9
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Certes ! Et en plus vu qu'on a un type anonyme, plus question de caster le current du bindingsource dans le type d'origine.

    Du coup, je lui explique pour le cellformatting et il ne veut pas car balayer toutes les cellules n'est pas optimisé .

    On parle d'une conversion de True en "Oui" et False en "Non"... Faut pas pousser quoi...

    Sorry pour ce message inutile mais j'avais besoin d'extérioriser ma frustration...

    Quelqu'un me file une corde au cas où ?

  10. #10
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 194
    Par défaut
    rien compris
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  11. #11
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    rien compris
    C'est rien, c'était pas le but.

  12. #12
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Par défaut
    Haha, je suis curieux de voir le jour où ton collègue viendra sur dvp et verra tes messages XD

    Sinon, une astuces pour l'aider à avaler la pilule du CellFormating, il ne balaye pas toutes les cellules mais uniquement les cellules visibles, c'est bien plus optimisé.

    Citation Envoyé par MSDN
    L'événement d' CellFormatting se produit chaque fois que chaque cellule est peinte, vous devez éviter un traitement long en gérant cet événement. Cet événement se produit également lorsque la cellule FormattedValue est récupérée ou sa méthode d' GetFormattedValue est appelée.

  13. #13
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 194
    Par défaut
    ah du coup j'ai compris
    Citation Envoyé par Kropernic Voir le message
    Du coup, je lui explique pour le cellformatting et il ne veut pas car balayer toutes les cellules n'est pas optimisé .
    comme le dit sankasssss l'évènement est levé à chaque fois qu'une cellule est dessinée, donc dans le pire des cas ca va être appelé 20x par colonne, soit 2 millisecondes en tout à mon avis (et encore je pense être large ) (c'est mesurable si nécessaire ^^)
    (+ des appels lors du scroll, mais j'en ai utilisé récemment et je n'a pas perçu le pouliième d'un nanoralentissement, de toute facon tout ce qui n'est pas graphique en .net est performant, et transformer un booléen en string c'est loin d'être violent)
    (nanoralentissement = ralentissement *10^-9)




    Citation Envoyé par Sankasssss Voir le message
    Haha, je suis curieux de voir le jour où ton collègue viendra sur dvp et verra tes messages XD
    moi ca m'est déjà arrivé ce genre de truc, on avait embauché un ptit jeune en alternance, je lui demande de faire un truc, je lui avais expliqué dans les grandes lignes
    et là je tombe sur un topic avec ce que je lui avais envoyé comme mail avec en préambule "on me demande de faire ceci mais je comprends rien et ca a l'air bizarre"
    je crois même que j'avais répondu un truc mais il avait pas du capter que c'était moi ^^
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  14. #14
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Par défaut
    Je n'ai jamais ressenti de ralentissement non plus pourtant ça m'est arrivé de faire bien plus qu'un test booléen dedans, genre mettre la ligne d'une certaine couleur en fonction de cas particuliers avec plusieurs tests.




    Moi ma collègue était tombée sur une discussion dont j'avais donné la réponse deux jours avant sans savoir que c'était moi (j'avais pas encore mon nom sous mon pseudo à l'époque) et m'avait fait part de sa solution. J'avais bien rigolé.
    Le truc de ton stagiaire, je sais pas comment je l'aurais pris

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [POO] Surcharge de méthode
    Par ouioui2000 dans le forum Langage
    Réponses: 4
    Dernier message: 09/03/2006, 15h25
  2. [Custom Tags] Problème avec une surcharge de méthode
    Par Strab dans le forum Taglibs
    Réponses: 19
    Dernier message: 26/08/2005, 16h34
  3. Type boolean MIN_VALUE || MAX_VALUE
    Par bxflash dans le forum Langage
    Réponses: 5
    Dernier message: 23/08/2005, 13h52
  4. [débutant] type boolean!!!
    Par just1980 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 10/08/2005, 10h47
  5. Comment surcharger la méthode OnClose d'un TFrame ?
    Par sdebrois dans le forum Composants VCL
    Réponses: 2
    Dernier message: 17/01/2005, 20h57

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