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 :

Personnaliser un contrôle de base


Sujet :

VB.NET

  1. #1
    Invité
    Invité(e)
    Par défaut
    Bonjour à toutes et tous,

    J'essaie de personnaliser un contrôle de base sous Visual Studio 2010 en suivant les conseils d'un livre mais rien ne se passe comme prévu...

    Si j'ai bien tout compris, je dois créer un contrôle utilisateur et hériter du contrôle sur lequel je veux me baser.

    Je fais donc ceci comme indiqué dans le livre :
    1. Je crée un projet de type "Bibliothèque de contrôles Windows"
    2. J'obtiens un genre de formulaire sans bord
    3. Je passe en fenêtre de code (F7)
    4. Je remplace l'héritage System.Windows.Forms.UserControl par System.Windows.Forms.CheckBox par exemple


    Le gros hic c'est que je ne vois pas cette ligne dans le fenêtre de code, je n'ai que ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Class UserControl1
     
    End Class
    J'essaie alors de provoquer l'héritage en entrant moi-même la ligne adéquate :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Inherits System.Windows.Forms.CheckBox
    Et là erreur ! VS me dit que la classe de base est définie 2 fois !

    Où dois-je donc aller pour modifier la classe de base ?

    Merci d'avance,

    webrider

    ********** Fusion **********

    Je viens encore de scruter le web et ma façon de faire paraît être la bonne, malgré tout VS me signale une erreur (en Anglais) :

    Error 1 Base class 'System.Windows.Forms.TextBox' specified for class 'UserControl1' cannot be different from the base class 'System.Windows.Forms.UserControl' of one of its other partial types. C:\Users\webrider\documents\visual studio 2010\Projects\WindowsControlLibrary1\WindowsControlLibrary1\UserControl1.vb 2 14 WindowsControlLibrary1
    Voici le code complet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Class UserControl1
        Inherits System.Windows.Forms.TextBox
    End Class
    Merci pour votre aide !

    webrider
    Dernière modification par Danyel ; 06/06/2011 à 18h39. Motif: Fusion

  2. #2
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut errare humanum est
    bonjour
    il faut un projet windows library c'est bon.
    Mais l'astuce
    1/c'est supprimer ce "usercontrol cree autoimatiquement"
    2/faire
    explorateur solutions->ton projet->ajouter un nouvel nouvel ->elements communs->windows forms->controle personnalise(CustomControl1.vb qu'il l'appelle microsoft sous vs version fr).
    et la tu "inherites".
    bon code....

  3. #3
    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 : 43
    Localisation : Belgique

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Par défaut
    Bonjour,

    ta façon de faire est bien la bonne mais malheureusement ce que tu ne sais pas, c'est que VS cache une partie du code dans un deuxième fichier pour la lisibilité.
    C'est dans ce deuxième fichier Designer que tu peux voir l'héritage ainsi que les méthode Dispose et InitializeComponent.
    Pour afficher ce fichier, tu dois aller dans l'explorateur de solutions et cliquer sur le deuxième icon : "Afficher tous les fichiers"



    Et voila tu peux voir le fichier Designer caché par VS

  4. #4
    Invité
    Invité(e)
    Par défaut
    @MABROUKI : Merci mais je ne comprends pas vraiment ta méthode...

    @Sankasssss : Grand merci, cette méthode fonctionne à merveille !

  5. #5
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut custom control
    bonjour sanskass
    Malheureusement pour ta gouverne ,je ne le sais que trop bien et je te recommende de lire MSDN pour la manipulation des fichiers designer.
    C'est une mauvaise pratique, non recommende par microsoft et elle peut abimer tout le projet.
    La methode que je donne est preconise par le proprietaire du logiciel VS ,en l'occurrence Microsoft.
    Il ne faut pas bidouiller.
    A bon entendeur salut....

  6. #6
    Invité
    Invité(e)
    Par défaut
    Mabrouki,

    Je viens d'essayer ta méthode mais elle ne change pas grand chose à mon problème. Lorsque j'hérite après avoir ajouté un "custom control" j'ai exactement le même message d'erreur à savoir qu'il existe déjà une classe de base qui est System.Windows.Forms.Control.

    Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Public Class CustomControl1
        Inherits System.Windows.Forms.CheckBox
        Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
            MyBase.OnPaint(e)
     
            'Add your custom paint code here
        End Sub
     
    End Class
    Et le message d'erreur :

    Error 1 Base class 'System.Windows.Forms.CheckBox' specified for class 'CustomControl1' cannot be different from the base class 'System.Windows.Forms.Control' of one of its other partial types.
    Vois-tu une erreur dans mon code ?

    Merci,

    webrider

  7. #7
    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 : 43
    Localisation : Belgique

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Par défaut
    Citation Envoyé par MABROUKI Voir le message
    bonjour sanskass
    Malheureusement pour ta gouverne ,je ne le sais que trop bien et je te recommende de lire MSDN pour la manipulation des fichiers designer.
    C'est une mauvaise pratique, non recommende par microsoft et elle peut abimer tout le projet.
    La methode que je donne est preconise par le proprietaire du logiciel VS ,en l'occurrence Microsoft.
    Il ne faut pas bidouiller.
    A bon entendeur salut....
    Je pense qu'il y a confusion, je n'ai jamais rien dit sur ta manière de faire.
    J'ai juste répondu à webrider:
    Citation Envoyé par webrider
    Je viens encore de scruter le web et ma façon de faire paraît être la bonne
    d'ou ma réponse :
    Citation Envoyé par webrider
    ta façon de faire est bien la bonne mais malheureusement ce que tu ne sais pas
    Par contre vu ta réaction j'ai voulu tester ta solution (malgré que tout mes collègue utilise ma méthode), j'ai donc suivi tes instructions (On cherche toujours à s'améliorer).
    Mais malheureusement je ne voit pas de différence, j'ai toujours une classe sans "Inherits" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Public Class CustomControl1
     
        Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
            MyBase.OnPaint(e)
     
            'Ajoutez ici votre code de dessin personnalisé
        End Sub
     
    End Class
    et j'ai toujours le Designer qui lui "Inherits" :
    Code : 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
    <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
    Partial Class CustomControl1
        Inherits System.Windows.Forms.Control
     
        'Control remplace la méthode Dispose pour nettoyer la liste des composants.
        <System.Diagnostics.DebuggerNonUserCode()> _
        Protected Overrides Sub Dispose(ByVal disposing As Boolean)
            Try
                If disposing AndAlso components IsNot Nothing Then
                    components.Dispose()
                End If
            Finally
                MyBase.Dispose(disposing)
            End Try
        End Sub
     
        'Requise par le Concepteur de contrôles
        Private components As System.ComponentModel.IContainer
     
        ' REMARQUE : la procédure suivante est requise par le Concepteur de composants
        ' Elle peut être modifiée à l'aide du Concepteur de composants. Ne la modifiez pas
        ' à l'aide de l'éditeur de code.
        <System.Diagnostics.DebuggerStepThrough()> _
        Private Sub InitializeComponent()
            components = New System.ComponentModel.Container()
        End Sub
     
    End Class
    Donc il semble logique que si on veux faire hériter le composant d'autre chose que System.Windows.Forms.Control il faut le changer dans le designer.
    Si tu sais nous montrer l'article disant comment il faut faire d'autre dans MSDN je suis preneur.

    De plus j'ai cherché un minimum sur le web suite à ces tests et j'ai trouvé cet article qui dit :
    The rapid fire description of the technique goes like this:

    1) Create a Windows Control Library project.
    2) Edit the hidden "designer" vb file and change the "inherits" clause to specify the control you want to modify instead.
    3) Fix the bug! (Again, more later.)
    4) Add logic to the code for the control and compile the component.
    Your control is ready to use!
    Donc quand tu réponds de la manière dont tu le fait, essaye d'avoir des sources pour appuyer tes écrits, c'est plus crédible et moins discutable.

    Bien à toi.
    Gaëtan.

  8. #8
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut custom control & msdn doc
    bonjour sankass
    tu n' as pas besoin,su tu as msdn lib sur ta machine.
    voic l'extrait en plus en msdn fr:

    Pour créer un contrôle personnalisé
    Créez un projet Application Windows ou Bibliothèque de contrôles Windows.

    Dans le menu Projet, choisissez Ajouter une classe.

    Dans la boîte de dialogue Ajouter un nouvel élément, cliquez sur Contrôle personnalisé.

    Un nouveau contrôle personnalisé est alors ajouté à votre projet.

    Appuyez sur F7 pour ouvrir l'éditeur de code pour votre contrôle personnalisé.

    Recherchez la méthode OnPaint qui doit être vide à l'exception d'un appel à la méthode OnPaint de la classe de base.

    Modifiez le code pour y insérer la peinture personnalisée que vous avez choisie pour votre contrôle.

    Pour plus d'informations sur l'écriture de code pour restituer des graphiques pour les contrôles, consultez Peinture et rendu personnalisés des contrôles.

    Implémentez les méthodes ou propriétés personnalisées que votre contrôle doit contenir.

    Enregistrez et testez le contrôle.

    La suite ......pour l'heritage dans rubriques " Comment : hériter de contrôles Windows Forms existants"

    Pour créer un contrôle hérité
    Créez un projet Windows.

    Ce projet peut être de n'importe quel type, par exemple une application Windows ou une bibliothèque de contrôles Windows. Si vous choisissez le type Bibliothèque de contrôles Windows, vous pouvez utiliser le contrôle vide qui vous est proposé et sauter les étapes 2 et 3.

    Dans le menu Projet, choisissez Ajouter un contrôle utilisateur.

    La boîte de dialogue Ajouter un nouvel élément s'affiche alors.

    Dans la boîte de dialogue Ajouter un nouvel élément, cliquez sur Contrôle personnalisé.

    Un nouveau contrôle personnalisé est alors ajouté à votre projet.

    Dans l'éditeur de code, localisez la ligne qui spécifie Control comme la classe de base pour l'héritage. Remplacez le nom de la classe de base par celui du contrôle dont vous voulez hériter.

    Par exemple, pour hériter de Button, écrivez la ligne suivante :

    Visual Basic Copier le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Inherits System.Windows.Forms.Button

    C# Copier le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class CustomControl1 : System.Windows.Forms.Button

    Pas besoin d'intervenir dans le fichier CustomControl1.Designer.vb ,sinon ce n'est plus un Designer,
    Puisqu'il affiche une alerte -en francais de surcroit chez moi- qui demande si l'on veut modifier le controle pour qu'il herite de la classe specifie par nos soins dans la clause Inherits.
    Il suffit de cliquer oui et il s'en charge de modifier le "code-behind du fichier CustomControl1.Designer.vb "

    Mais on n' a pas a aucun moment besoin d'aller dans ce fichier et le modifier.
    Sinon pour "hacker le code automatique genere".
    Evidemment on est toujours libre de sortir des bonnes pratiques de Microsoft à ses risques & perils .....
    bonne soiree...

  9. #9
    Invité
    Invité(e)
    Par défaut
    Pour ma part je pense que vous avez tous deux la bonne façon de faire mais elle est différente suivant la version de Visual Studio que vous utilisez !

    J'ai fait les tests sous la version 2003 et 2010 :

    Sous 2003 l'héritage apparaît sans devoir faire quoi que ce soit, il est donc possible de modifier la classe de base en 2 secondes dans la fenêtre de code. De plus, le code caché est affiché dans la fenêtre de code (dans une région spécifique - code généré par visual studio).

    Sous 2010 l'héritage n'apparaît pas dans la fenêtre de code, il faut donc utiliser la méthode de Sankasssss.

    Qu'en pensez-vous ?

    webrider

  10. #10
    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 : 43
    Localisation : Belgique

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Par défaut
    Bonjour MABROUKI et webrider,

    Merci MABROUKI pour ces sources, cependant j'ai de nouveau essayé étape par étape car j'essaye de respecter au mieux les bonnes méthodes

    (c'est d'ailleurs pour cela que je suis occupé à lire [ame="http://www.amazon.fr/Coder-proprement-Robert-C-Martin/dp/2744023272"]Coder proprement: Amazon.fr: Robert C.Martin: Livres@@AMEPARAM@@http://ecx.images-amazon.com/images/I/51g-TFOHpGL.@@AMEPARAM@@51g-TFOHpGL[/ame])

    et malheureusement la citation MSDN ne fonctionne pas, par contre ta façon de faire fonctionne bien elle (voir fin).

    Je m'explique sur ce qui ne va pas dans la citation de MSDN, c'est principalement sur la ligne en rouge de ta citation :
    Pour créer un contrôle hérité
    Créez un projet Windows.

    Ce projet peut être de n'importe quel type, par exemple une application Windows ou une bibliothèque de contrôles Windows. Si vous choisissez le type Bibliothèque de contrôles Windows, vous pouvez utiliser le contrôle vide qui vous est proposé et sauter les étapes 2 et 3.

    Dans le menu Projet, choisissez Ajouter un contrôle utilisateur.

    La boîte de dialogue Ajouter un nouvel élément s'affiche alors.

    Dans la boîte de dialogue Ajouter un nouvel élément, cliquez sur Contrôle personnalisé.

    Un nouveau contrôle personnalisé est alors ajouté à votre projet.

    Dans l'éditeur de code, localisez la ligne qui spécifie Control comme la classe de base pour l'héritage. Remplacez le nom de la classe de base par celui du contrôle dont vous voulez hériter.

    Par exemple, pour hériter de Button, écrivez la ligne suivante :

    Visual Basic Copier le code
    Inherits System.Windows.Forms.Button


    C# Copier le code
    public class CustomControl1 : System.Windows.Forms.Button
    le problème est donc comme je te l'ai marqué dans mon dernier post que dans le code principale la classe créée n'hérite de rien du coup difficile de remplacer quoi que ce soit...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Public Class CustomControl1
     
        Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
            MyBase.OnPaint(e)
     
            'Ajoutez ici votre code de dessin personnalisé
        End Sub
     
    End Class
    La seul classe qui hérite est la class partielle :
    Code : 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
    <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
    Partial Class CustomControl1
        Inherits System.Windows.Forms.Control
     
        'Control remplace la méthode Dispose pour nettoyer la liste des composants.
        <System.Diagnostics.DebuggerNonUserCode()> _
        Protected Overrides Sub Dispose(ByVal disposing As Boolean)
            Try
                If disposing AndAlso components IsNot Nothing Then
                    components.Dispose()
                End If
            Finally
                MyBase.Dispose(disposing)
            End Try
        End Sub
     
        'Requise par le Concepteur de contrôles
        Private components As System.ComponentModel.IContainer
     
        ' REMARQUE : la procédure suivante est requise par le Concepteur de composants
        ' Elle peut être modifiée à l'aide du Concepteur de composants. Ne la modifiez pas
        ' à l'aide de l'éditeur de code.
        <System.Diagnostics.DebuggerStepThrough()> _
        Private Sub InitializeComponent()
            components = New System.ComponentModel.Container()
        End Sub
     
    End Class
    qui à la ligne 3 hérite de System.Windows.Forms.Control et que l'on doit changer par ce que l'on veux hériter.

    J'ai quand même essayer dans le code de la classe de base de rajouter l'héritage :

    mais alors l'erreur que webrider à décrite dans ces premiers post apparaît :
    Erreur 1 La classe de base 'System.Windows.Forms.TextBox' spécifiée pour la classe 'CustomControl1' ne peut pas être différente de la classe de base 'System.Windows.Forms.Control' de l'un de ses autres types partiels. C:\Users\Sankasssss\AppData\Local\Temporary Projects\WindowsApplication1\CustomControl1.vb 2 14 WindowsApplication1
    et la je te rejoint sur ce que tu dis toi, à savoir :

    Citation Envoyé par MABROUKI
    Pas besoin d'intervenir dans le fichier CustomControl1.Designer.vb ,sinon ce n'est plus un Designer,
    Puisqu'il affiche une alerte -en francais de surcroit chez moi- qui demande si l'on veut modifier le controle pour qu'il herite de la classe specifie par nos soins dans la clause Inherits.
    Il suffit de cliquer oui et il s'en charge de modifier le "code-behind du fichier CustomControl1.Designer.vb "
    car il est vrais que si on clique maintenant sur la ligne de l'erreur il nous propose de changer la classe partielle et que l'on se retrouve avec deux classe qui hérite de la même classe et qu'il n'y a donc plus de problème.
    Voilà quelque chose qui est bon de savoir et que je n'avais jamais testée vu que j'ai toujours modifié la classe designer pour se faire.




    P.S. : Tu aurais pu dire à webrider dès ton premier post qu'il suffisait de cliquer sur l'erreur, ça nous aurait évité ce début de crêpage de chignon (malgré que je n'ai plus beaucoup de cheveux )

  11. #11
    Invité
    Invité(e)
    Par défaut
    P.S. : Tu aurais pu dire à webrider dès ton premier post qu'il suffisait de cliquer sur l'erreur, ça nous aurait évité ce début de crêpage de chignon
    LOL Je viens d'apprendre ça aussi et effectivement c'est encore le plus simple !

    Merci à vous deux en tous cas !

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

Discussions similaires

  1. Personnaliser un type de base
    Par monmien dans le forum C#
    Réponses: 8
    Dernier message: 07/07/2011, 16h49
  2. outil pour contrôle integrité base de données
    Par fgalves dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 04/05/2011, 14h54
  3. Réponses: 3
    Dernier message: 16/11/2009, 11h48
  4. Personnaliser le formulaire de base pour un projet
    Par toure32 dans le forum Delphi
    Réponses: 2
    Dernier message: 13/11/2006, 23h43
  5. Réponses: 1
    Dernier message: 25/01/2006, 21h44

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