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 :

Ajouter une propriété sous forme de liste à un contrôle personnalisé [Débutant]


Sujet :

VB.NET

  1. #1
    Membre régulier

    Profil pro
    Inscrit en
    Août 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 213
    Points : 103
    Points
    103
    Par défaut Ajouter une propriété sous forme de liste à un contrôle personnalisé
    Bonjour,

    J'aimerai savoir comment réussir à ajouter dans un contrôle personnalisé, une propriété sous forme d'une liste déroulante.
    Si je prend par exemple le controle Button, il y a la propriété FlatStyle où l'on peut choisir "Flat", "Popup", etc... J'aimerai avoir la même chose dans mon contrôle personnalisé.
    J'ai ceci, mais la variable ne s'affiche pas dans les propriétés du cotrole.
    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
    Public Class Transmetteur
        Inherits Bloc
     
        Dim _essai() As String = {"choix1", "choix1"}
     
        Public Property Essai(ByVal Index As Integer) As String
            Get
                Return _essai(Index)
            End Get
            Set(ByVal value As String)
                _essai(Index) = value
            End Set
        End Property
     
    End Class
    Merci d'avance

  2. #2
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Salut,

    tu peux regarder du côté de cette page : Design-Time Attributes for Components.
    Pour le cas particulier d'un choix multiple il faudra peut-être que ta property corresponde à une enum, et non à un tableau, mais rien de sûr.

  3. #3
    Membre régulier

    Profil pro
    Inscrit en
    Août 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 213
    Points : 103
    Points
    103
    Par défaut
    Merci beaucoup, en effet il fallait partir sur enum. A partir de la une petite recherche google et voici donc le code :
    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
     
    Public Class Transmetteur
        Inherits Bloc
     
     
        Public Enum Slots
            BuyersAgent
            SellersAgent
        End Enum
     
        Private mSlotType As Slots = Slots.BuyersAgent
     
        Public Property SlotType() As Slots
            Get
                Return mSlotType
            End Get
            Set(ByVal value As Slots)
                mSlotType = value
            End Set
        End Property
     
    End Class
    J'en profite pour poser une autre question au passage. Dans l'editeur, lorsque les propriétés de l'objet sont triés par catégories, celle-ci se met automatiquement dans la catégorie "Divers". Peut-on définir une nouvelle catégorie?

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    oui, on choisit le nom et ca regroupe

    et là le lien cité plus haut est bon (categoryattribute)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <System.ComponentModel.Category("nom au choix")>
    public property mapropriété as ...

  5. #5
    Membre régulier

    Profil pro
    Inscrit en
    Août 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 213
    Points : 103
    Points
    103
    Par défaut
    C'est nickel, merci beaucoup pour le tuyau.

  6. #6
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Petite remarque : les noms de catégories sont à mettre en anglais (ex. "Data" pour être dans la catégorie "Données")

  7. #7
    Membre régulier

    Profil pro
    Inscrit en
    Août 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 213
    Points : 103
    Points
    103
    Par défaut
    Citation Envoyé par jopopmk Voir le message
    Petite remarque : les noms de catégories sont à mettre en anglais (ex. "Data" pour être dans la catégorie "Données")
    C'est bon à savoir

  8. #8
    Membre régulier

    Profil pro
    Inscrit en
    Août 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 213
    Points : 103
    Points
    103
    Par défaut
    J'aimerai également savoir, comment avoir dans une propriété, la liste de tous les objets présent d'un certain type. Par exemple pouvoir choisir parmis tous les listbox de la form.

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public property unlistbox as listbox
    et visual studio s'occupera de proposer les listbox présents sur la fenetre

  10. #10
    Membre régulier

    Profil pro
    Inscrit en
    Août 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 213
    Points : 103
    Points
    103
    Par défaut
    Merci, je pensais que c'était plus compliqué.
    Par contre je voulais pouvoir recevoir plusieurs types d'objets, j'ai donc trouvé cette solution : les classes que je souhaite héritent tous d'une classe commune
    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
    Public Class Bloc
        Public value As Integer
    End Class
     
    Public Class SousBloc
        inhérit Bloc
        ...
    End Class
     
    Public Class Untel
        Public Property unbloc As bloc
        fonction getValue() as integer
            return unBloc.value
        end function
    End Class
    Par contre ça ne m'arrange pas de devoir hériter de la même classe, il y a d'autre possibilités?

  11. #11
    Membre régulier

    Profil pro
    Inscrit en
    Août 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 213
    Points : 103
    Points
    103
    Par défaut
    Je pense avoir un début de réponse en passant pas des collections de contrôles. Je verrai ça demain.

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    pour avoir n'importe quel type de controle dans ta propriété il faut la mettre as Control
    par contre ca va être de filtrer sur le type avec ce système

    par contre il est possible de modifier le comportement d'édition d'une propriété dans le property grid (controle utilisé pour afficher les propriétés et leur valeur)
    tu peux regarder, sur la propriété Anchor par exemple c'est un petit usercontrol qui s'affiche
    sur certaines propriétés qui peuvent contenir plusieurs choses (c'est ce que tu voudrais apparemment) c'est une fenetre qui s'ouvre permettant d'ajouter plusieurs éléments

    donc tu peux faire une petite classe qui va expliquer à visual studio ce qu'il doit faire pour éditer ta propriété, et par exemple ouvrir une fenetre qui liste tous les controles de certains types permettant de les sélectionner

    (pour commencer : attribut system.componentmodel.editor et faire une classe qui doit hériter de uitypeeditor il me semble (nécessite system.Drawing.design et/ou system.Design))

  13. #13
    Membre régulier

    Profil pro
    Inscrit en
    Août 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 213
    Points : 103
    Points
    103
    Par défaut
    J'avoue être un peu l'argué pour le coup, un exemple ne serait pas de trop...

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    un exemple

    ajouter system.Drawing.Design en référence au projet

    une classe hérite de control (ca fonctionnera pareil avec un usercontrol) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Public Class mycontrol
        Inherits Control
     
        <System.ComponentModel.Editor(GetType(MyStringEditor), GetType(System.Drawing.Design.UITypeEditor))>
        Public Property UnString As String
     
    End Class
    l'attribut Editor avant une propriété sert à dire à visual studio la classe qui gère l'édition
    comme dit précédemment, certains propriétés on écrit ce qu'on veut dedans, certaines c'est un usercontrol qui est affiché (comme Anchor), et d'autres c'est une fenetre qui s'ouvre (collections)


    il faut donc écrire cette classe, héritant de uitypeeditor, et 2 méthodes sont à overrider

    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
    Public Class MyStringEditor
        Inherits System.Drawing.Design.UITypeEditor
     
        Public Overrides Function GetEditStyle(context As System.ComponentModel.ITypeDescriptorContext) As Drawing.Design.UITypeEditorEditStyle
            Return Drawing.Design.UITypeEditorEditStyle.Modal ' modal = ouverture de fenetre modale   DowpDown = usercontrol affiché
        End Function
     
        Public Overrides Function EditValue(context As System.ComponentModel.ITypeDescriptorContext, provider As IServiceProvider, value As Object) As Object
            Dim f As New Form
            Dim t As New TextBox
            If value IsNot Nothing Then t.Text = value.ToString
            f.Controls.Add(t)
            f.ShowDialog()
            Return t.Text
        End Function
    End Class
    GetEditStyle est appelé par visual studio pour savoir ce qu'il doit afficher (rien, "..." pour une fenetre qui va s'ouvrir ou une flèche bas comme sur un combobox pour un usercontrol)
    ensuite quand on clic sur ... ou sur la flèche bas la méthode EditValue est appelée, value contient la valeur actuelle, et en cas de modification il faut la retourner dans la fonction (sinon retourner value)
    donc ici j'ai fait un exemple qui ouvre une fenetre avec un textbox, et quand on la feme ce qu'on a saisie dans le textbox est mis dans la propriété du control qu'on modifie en mode design


    à partir de là vu que vs va exécuter notre code .net on peut se lacher et faire ce qu'on veut pour gérer l'édition, sur context on doit pouvoir retrouver l'instance qui est en cours d'édition, donc avec .findform la fenetre, et donc savoir tout ce qui est dessus

  15. #15
    Membre régulier

    Profil pro
    Inscrit en
    Août 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 213
    Points : 103
    Points
    103
    Par défaut
    Merci pour l'exemple, sa fonctionne, je n'ai plus qu'à creuser un peu.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 16/08/2012, 01h57
  2. Recuperer les donnees d'une base de donnee sous forme de liste
    Par j-gat dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 29/11/2010, 04h45
  3. Réponses: 5
    Dernier message: 12/10/2009, 18h03
  4. [Choix langages] Une application sous forme software et web
    Par fremsoi dans le forum Langages de programmation
    Réponses: 3
    Dernier message: 17/11/2004, 16h05
  5. [active X] ajouter une propriété
    Par Blo0d4x3 dans le forum MFC
    Réponses: 4
    Dernier message: 22/09/2004, 10h47

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