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 :

ContextMenu cree dynamiquement


Sujet :

VB.NET

  1. #1
    Membre régulier
    Homme Profil pro
    Scientist
    Inscrit en
    Mai 2013
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Scientist
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2013
    Messages : 110
    Points : 87
    Points
    87
    Par défaut ContextMenu cree dynamiquement
    Bonsoir,

    Voila, je cree une serie de Boutons sur un Panel en cliquant sur un Bouton "Add".
    En meme temps, j'ai cree un ContextMenu dynamiquement avec une seule option "Delete". Soit:
    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
    Private Sub btn_Click(...
            aButton = New Button
            aButton.Location = New Point(20, 20)
            aButton.Size = New Size(sideB, sideA)
            aButton.Font = New Font("Arial", 10, FontStyle.Bold)
            AddHandler aButton.MouseDown, AddressOf aButton_MouseDown
            AddHandler aButton.MouseUp, AddressOf aButton_MouseUp
            AddHandler aButton.MouseMove, AddressOf aButton_MouseMove
            '-----------------------------------------------------
            ' ContextMenu to Delete a Button
            '-----------------------------------------------------
            Dim cms As New ContextMenuStrip
            Dim item As ToolStripItem = cms.Items.Add("Delete")
            AddHandler item.Click, AddressOf cmsDelete_Click
            aButton.ContextMenuStrip = cms
            '-----------------------------------------------------
            myPanel.Controls.Add(aButton)
    End Sub
    Et l'adresse de cmsDelete_Click:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub cmsDelete_Click(ByVal sender As Object, ByVal e As System.EventArgs)
            Dim selectedButton As Button = (From c In myPanel.Controls Select c).FirstOrDefault
            myPanel.Controls.Remove(selectedButton)
    End Sub
    J'ai donc essaye du LINQ, mais ce n'est pas tout a fait bon.
    Dans ce cas j'enleve toujours le dernier Boutons crees dynamiquement et pas le Bouton selectionne.
    Je comprends pourquoi, mais je ne vois pas comment resoudre ce probleme. Cela devrait pourtant pas etre tres complique (excepte pour moi apparement!)

    Un petit coup de pouce serait le bienvenu.
    Merci,
    A+
    JLuc01

  2. #2
    Membre émérite
    Avatar de azstar
    Homme Profil pro
    Architecte Technique BizTalk/.NET
    Inscrit en
    Juillet 2008
    Messages
    1 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Technique BizTalk/.NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 198
    Points : 2 424
    Points
    2 424
    Par défaut
    essaie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    contextMenuStrip1.Show(Button1, Button1.PointToClient(Cursor.Position));

  3. #3
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Bonjour,

    Il est toujours intéressant de nommer les contrôles, cela peut permettre de les retrouver. (en donnant le focus au bouton sur clic droit, ensuite on peut le rechercher)

    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
        Private IndiceNom As Integer = 0 'uniquement pour donner un nom différent à chaque bouton créé dynamiquement.
        Private Sub btnCMDyn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCMDyn.Click
            Dim aButton As Button = New Button
            IndiceNom += 1
            aButton.Name = IndiceNom.ToString 'juste pour des noms différents
    '...
        End Sub
     
        Private Sub cmsDelete_Click(ByVal sender As Object, ByVal e As System.EventArgs)
            MyPanel.Controls.RemoveByKey(ActiveControl.Name) 'retrouve le controle par son nom
        End Sub
     
        Private Sub aButton_MouseUp(ByVal sender As Object, ByVal e As MouseEventArgs)
            If e.Button = MouseButtons.Right Then sender.focus() ' Définit le focus d'entrée sur le contrôle. 
            ' ou ...     sender.select() 'Active un contrôle. 
            ' ou ...     ActiveControl = sender
        End Sub
    définir le focus sur un contrôle, Control.Focus, Control.Select.

    Il existe peut-être d'autres solutions.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  4. #4
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour

    Cela releve de l'utilisation accoutume des contextmenus...
    Tu n'as pas besoin de linq dans ce cas d'espece ,puisque ContextMenuStrip dispose de l'infrastructure approprie:sourcecontrol simplement ...
    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
     
    Public Class Form1
        Private aButton As New Button
        Private rnd As Random = New Random
        Private Sub btn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn.Click
            Dim cms As New ContextMenuStrip
            For i As Integer = 1 To 5
                aButton = New Button
                aButton.Text = "btn" + i.ToString
                aButton.Location = New Point(rnd.Next(50, 600), rnd.Next(50, 400))
                aButton.Size = New Size(75, 25)
                aButton.Font = New Font("Arial", 10, FontStyle.Bold)
                Panel1.Controls.Add(aButton)
                aButton.ContextMenuStrip = cms
     
            Next
     
     
     
            '-----------------------------------------------------
            ' ContextMenu to Delete a Button
            '-----------------------------------------------------
            Dim item As ToolStripItem = cms.Items.Add("Delete")
     
            AddHandler item.Click, AddressOf cmsDelete_Click
     
            '-----------------------------------------------------
     
        End Sub
     
     
     
     
     
        Private Sub cmsDelete_Click(ByVal sender As Object, ByVal e As EventArgs)
            Dim item As ToolStripItem = CType(sender, ToolStripItem)
            Dim cms As ContextMenuStrip = item.Owner
            Dim selectedButton As Button = cms.SourceControl
            Panel1.Controls.Remove(selectedButton)
     
        End Sub
     
     
    End Class
    Linq n'est utile que si tu veux faire des traitements sur un groupe de boutons selectionne suivant un critere....
    bon code........

  5. #5
    Membre régulier
    Homme Profil pro
    Scientist
    Inscrit en
    Mai 2013
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Scientist
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2013
    Messages : 110
    Points : 87
    Points
    87
    Par défaut
    Re-bonjour,

    Tres interessant tout ca.

    Aztar, interessant, mais je ne vois pas comment faire pour l'adapter a mon cas.

    rv26t,
    En fait ,dans mon code, j'avais aussi les lignes suivantes dans l'evenement "btnCMDyn.Click":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    iCounter = iCounter + 1
    aButton.Text = iCounter.ToString
    Je sais ce n'est pas la propriete "Name", mais j'ai essaye d'adapter comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myPanel.Controls.RemoveByKey(CInt(SplitContainer1.ActiveControl.Text))
    Cependant, cela ne marche pas. Pourtant en "Debug", j'ai SplitContainer1.ActiveControl.Text = "2".
    Mais, l'idee est certainement a retenir.

    MABROUKI,
    Rien a dire: ca marche impeccable.
    En fait, il suffit de chercher un peu plus les proprietes/methodes dans les controles, sauf si on connait tres bien le controle en question.

    Merci a tous,
    A+
    JLuc01

  6. #6
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Citation Envoyé par JLuc01 Voir le message
    En fait ,dans mon code, j'avais aussi les lignes suivantes dans l'evenement "btnCMDyn.Click":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    iCounter = iCounter + 1
    aButton.Text = iCounter.ToString
    Je sais ce n'est pas la propriete "Name", mais j'ai essaye d'adapter comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myPanel.Controls.RemoveByKey(CInt(SplitContainer1.ActiveControl.Text))
    Cependant, cela ne marche pas. Pourtant en "Debug", j'ai SplitContainer1.ActiveControl.Text = "2".
    Mais, l'idee est certainement a retenir.
    La méthode RemoveByKey (Control.ControlCollection.RemoveByKey, méthode) prend comme paramètre le nom (Name) du contrôle enfant à supprimer de la collection du contrôle conteneur (MyPanel). (explication pour info, puisque la méthode de Mabrouki est la solution a utiliser)
    Sinon cela ne peut pas fonctionner.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  7. #7
    Membre régulier
    Homme Profil pro
    Scientist
    Inscrit en
    Mai 2013
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Scientist
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2013
    Messages : 110
    Points : 87
    Points
    87
    Par défaut
    rv26t, merci pour les precisions!

    A+
    JLuc01

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/11/2006, 18h59
  2. Réponses: 3
    Dernier message: 19/10/2006, 09h47
  3. [FLASH MX2004] Probleme assignation de police pour controle cree dynamiquement
    Par Demco dans le forum ActionScript 1 & ActionScript 2
    Réponses: 2
    Dernier message: 03/05/2006, 12h07
  4. [VBA-E] Retrouver un textbox créé dynamique
    Par wind_vinch dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 14/10/2005, 12h51
  5. Réponses: 2
    Dernier message: 12/01/2005, 10h18

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