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 :

Controle utilisateur et "popup" (VS2015)


Sujet :

VB.NET

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 169
    Points : 100
    Points
    100
    Par défaut Controle utilisateur et "popup" (VS2015)
    Bonjour,

    Je voudrais créer un contrôle utilisateur qui ouvre un Panel ( ou mieux, un TableLayout Panel) avec des contrôles dedans.
    Ce contrôle utilisateur serait juste constitué d'un bouton qui, lorsqu'il est cliqué, afficherait le Panel. Comme par exemple un combobox affiche une liste drop-down quand on clique la flêche.
    Ce Panel (ou TableLayoutPanel) doit pouvoir être "designé" dans ma solution.

    J'ai fait un test. Le bouton BtnDropDown ouvre bien un Panel sur la forme contenant le UserControl ça, je sais faire mais, plutôt que de créer les contrôles en dynamique, je préférerais avoir un Panel "prédéfini" que je peux modifier en design.
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    Private Sub BtnDropDown_Click(sender As Object, e As EventArgs) Handles BtnDropDown.Click
            Dim frm As Form
            Static Show As Boolean
     
            frm = Me.ParentForm.FindForm
     
            Show = Not Show 
     
            ShowCalendar(Show , frm)
     
    End Sub
     
    Private Sub ShowCalendar(ByVal Show As Boolean, ByVal frm As System.Windows.Forms.Form)
            If Show Then
                Dim ctl As New Panel
     
                With ctl
                    .Name = "xxx"
                    .BorderStyle = BorderStyle.FixedSingle
                    .Size = _size
     
     
                    Dim pt As New Drawing.Point(Me.Left, Me.Top + Me.Height)
                    .Location = pt
                End With
     
                AddControls(ctl)
     
                frm.Controls.Add(ctl)
     
            Else
                frm.Controls("xxx").Dispose()
            End If
     
    End Sub
     
    Private Sub AddControls(ctl As Panel)
            Dim btndwn As New Button With {.Name = "Btndwn", .Size = New Size(22, 22), .Text = "t", .Font = New Font("Wingdings 3", 10), .Left = 0, .Top = ctl.Height - 22}
            AddHandler btndwn.Click, AddressOf ClickHandler
            ctl.Controls.Add(btndwn)
     
            Dim btnup As New Button With {.Name = "Btnup", .Size = New Size(22, 22), .Text = "u", .Font = New Font("Wingdings 3", 10), .Left = ctl.Width - 22, .Top = ctl.Height - 22}
            ctl.Controls.Add(btnup)
     
     
           etc....etc....
    End Sub
     
    Private Sub ClickHandler(sender As Object, e As EventArgs)
            'pour faire quelque chose.....
    End Sub
    En fait je voudrais pouvoir remplacer la routine ShowCalendar par quelque chose du genre frm.controls.add(Popup)

    Bref, dans ma solution "bibliotheque de classe", quel élément dois-je utiliser (je suis un peu perdu parmi toutes les possibilités de VS) pour que je puisse donc designer ce popup et comment l'appeler.


    Autre question: comme vous voyez, pour "fermer" le popup, je fais un dispose du Panel (et donc de tous les contrôles s'y trouvant). C'est pas trop radical/dangereux?

    Merci pour vos avis

    Olivier

  2. #2
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Pourquoi te casser la tête ? (Ou bien, je n'ai rien compris. Ou bien, je ne vois pas l'utilité de créer un contrôle dynamiquement dans un contrôle utilisateur déjà présent. Après tout un contrôle, ou une bibliothèque de classes, sont supposés être des programmes de codes facilement réutilisables)

    Tu te fais une form calendrier bien ordinaire.

    pour ouvrir
    pour fermer sans l'effacer.

    Rien ne t'empêche d'jouter un contrôle (Une Form c'est un contrôle) et d'en modifier les propriétés manuellement, ou par programmation avant de l'afficher.
    Ou bien tu mets ton TableLayoutPanel manuellement et tu le caches ou l'affiche au besoin.

    Sinon, je passe mon tour.
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 169
    Points : 100
    Points
    100
    Par défaut
    Citation Envoyé par clementmarcotte Voir le message
    Bonjour,

    Pourquoi te casser la tête ? (Ou bien, je n'ai rien compris. Ou bien, je ne vois pas l'utilité de créer un contrôle dynamiquement dans un contrôle utilisateur déjà présent. Après tout un contrôle, ou une bibliothèque de classes, sont supposés être des programmes de codes facilement réutilisables)

    Tu te fais une form calendrier bien ordinaire.

    pour ouvrir
    pour fermer sans l'effacer.

    Rien ne t'empêche d'jouter un contrôle (Une Form c'est un contrôle) et d'en modifier les propriétés manuellement, ou par programmation avant de l'afficher.
    Ou bien tu mets ton TableLayoutPanel manuellement et tu le caches ou l'affiche au besoin.

    Sinon, je passe mon tour.
    J'ai bien vu le contrôle livré avec VS mais il lui manque des propriétés (couleurs individuelles par jour, possibilité d'y placer une imagette...). C'est pour cela que je me casse un peu la tête ;-)
    Ensuite, je voudrais peut être réutiliser le même principe pour d'autre types de Usercontrol qu'un calendrier (des listes, checkbox...)
    Merci quand même.

  4. #4
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Bonjour,

    Je rejoins Clement sur son raisonnement mais si tu as envie de mieux appréhender certains concepts des userControl alors pourquoi pas....bref....
    Tu dis pouvoir paramétrer le panel (ou TableLayoutPanel) alors pourquoi ne pas créer une extension de la classe Panel genre PanelEx :

    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
     
    Public Class PanelEx
        Inherits Panel
     
    #region "Fields"
     
    #End Region
     
    #region "Properties"
     
    #End Region
     
    #region "Events"
     
    #End Region
     
    #region "Delegates"
     
    #End Region
     
    #region "Constructor"
        public sub new()
        end sub
    #End Region
     
    End class
    a+

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 169
    Points : 100
    Points
    100
    Par défaut
    La proposition de Clément de créer une Form est presque ce que je cherche mais le UserControl l'appelle pour s'afficher mais alors il s'agit d'une forme "indépendante" alors que je voudrais que cela reste "dans la Form" contenant le UserControl. L'utilisateur peut remettre le focus sur la Form appelante et bye bye le popup. La solution de la mettre en modale présente des effets "secondaires" que je dois éviter aussi.
    J'ai vu la classe composant mais elle ne permet pas de "dessiner" wyswyg le popup avec ses composants. Je cherche l'élément de VS2015 qui pourrait satisfaire la problematique.

  6. #6
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations forums :
    Inscription : Mars 2011
    Messages : 105
    Points : 153
    Points
    153
    Par défaut
    Bonjour,

    Tu pourrais utiliser un panel sur lequel tu définis les controls dont tu as besoin.
    Tu passes ensuite ce panel en invisible.

    En utilisation, le bouton BtnDropDown rend ce panel visible (ou invisible).
    Avant de le rendre visible, il vaut mieux veiller à confirmer deux trois choses:
    - parent du panel
    - taille / position
    - mettre au premier plan

    La conception peut sembler un peu "bordélique", mais ça marche bien:



    A l'usage (quelques panels qui s'affichent ou s'effacent) .
    C'est sur une tablette, donc plutôt en plein écran.

    Panel de base :


    panel config:


    panel epg:


    panel ecran serveur:

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 169
    Points : 100
    Points
    100
    Par défaut
    C'est une solution...mais qui ne va pas car si j'ai n Formes avec ce UserControl, il faudra que j'ajoute n fois ce panel. Et je ne parle pas de la maintenance du Panel qui faudra répercuter sur les n Formes. Merci quand même

  8. #8
    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 : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par zitoune92 Voir le message
    La proposition de Clément de créer une Form est presque ce que je cherche mais le UserControl l'appelle pour s'afficher mais alors il s'agit d'une forme "indépendante" alors que je voudrais que cela reste "dans la Form" contenant le UserControl.
    Pourquoi est-ce que tu veux absolument que ca reste "dans la Form" ?

    Citation Envoyé par zitoune92 Voir le message
    L'utilisateur peut remettre le focus sur la Form appelante et bye bye le popup. La solution de la mettre en modale présente des effets "secondaires" que je dois éviter aussi.
    Tu peux faire une fenetre qui se ferme lorsqu'elle perd le focus en utilisant la methode Show(...) puis en fermant la fenetre dans l'evenement Deactivate de la popup.
    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.

  9. #9
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    alors que je voudrais que cela reste "dans la Form" contenant le UserControl. L'utilisateur peut remettre le focus sur la Form appelante et bye bye le popup.
    Une idée qui m'est passée par la tête, mais sans aucun test, ni autre garantie. (Évidemment, là on parle plus de remplacer un affichage par un autre. À moins que quelqu'un connaîtrait une passe savante, ou une passe croche pour faire autrement.)

    Si tu mettais un TabControl avec ton interface principale en page 1 et ton TableLayoutPanel en page 2 ?

    Ou bien un SplitContainer ?

    OK, je vais me coucher
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

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