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

Windows Forms Discussion :

Détecter le click sur une combobox d'une datagridview


Sujet :

Windows Forms

  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 184
    Points : 619
    Points
    619
    Par défaut Détecter le click sur une combobox d'une datagridview
    J'au un objet datagridview qui comprend en première colonne une combobox (DataGridViewComboBoxColumn)
    Je voudrais pouvoir gérer l'évènement lorsque l'utilisateur change la ligne de cette combobox

    Dans le EditingControlShowing de la datagrid j'ai ajouté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AddHandler e.Control.Click, AddressOf MaMéthodeQuiTraiteClick
    (comme je l'avais fait pour gérer le KeyPress)

    Mais cette méthode MaMéthodeQuiTraiteClick n'est pas appelée

  2. #2
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 776
    Points
    1 776
    Par défaut
    Bonjour.

    Oula, j'espére que tu ne t'attends pas à lever l'event click lors d'un click souris sur la liste ...

    Parce que cela ne marchera pas, le click n'est valable que sur la zone cliente du control combobox.

    Si ton soucis est là, il faut peut être que tu creuses du côté de CellValueChanged ou définir un combo personnel.

    Cdt.
    Bon à savoir : la touche F1 ne sert pas à commander des places pour le grand prix de Belgique.

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 184
    Points : 619
    Points
    619
    Par défaut
    Merci de m'avoir répondu, je commençais à désespérer.
    En fait le CellValueChanged ne se déclenche que quand on quitte la cellule. J'aurais préféré trapper l'évènement quand la Selectedvalue de la combobox change.

    Faute de mieux je vais avancer avec cela.
    Sinon ou est-il possible de placer sa propre combobox dans une dataGridView ? Je n'ai vu que des types standards.

  4. #4
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 776
    Points
    1 776
    Par défaut
    Bonjour.

    Ok, je vois bien le soucis.

    Bon, la problématique est que tu veux détecter un event spécifique du control encapsulé dans la cellule de la colonne d'un datagridview.

    Il faut donc remonter l'event du control encapsulé vers le "monde extérieur".

    Le soucis vient du fait que dans un DGV, tu déclares des colonnes qui se composent de celulles, la colonne ne sachant pas quand l'une de ses cellules est activée.

    On peut contourner cela en partageant un event sur l'ensemble de cellules de la colonne sur lequel on peut s'abonner lors de la création de cette colonne.

    Oula, c'est pas super super clair tout ça !!!!

    En résumé, l'idée c'est d'utiliser un event partagé par l'ensemble des cellules d'une même colonne.

    Comme c'est difficile à expliquer et qu'on pourrait tourner en rond des années avant de ce comprendre, voici un exemple :

    La classe colonne de DGV de type combo qui léve un event sur changement de valeur :
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
    Option Explicit On
    Option Strict On
    #Region "ComboWithClickEvent COLUMN"
     
    Public Class ComboWithClickEventEditingControl
        Inherits DataGridViewComboBoxEditingControl
        Implements IDataGridViewEditingControl
     
        Public Event ValueChanged(ByVal NewValue As String)
     
        Protected Overrides Sub OnSelectedValueChanged(ByVal eventargs As EventArgs)
            MyBase.OnSelectedValueChanged(eventargs)
            RaiseEvent ValueChanged(Me.Text)
        End Sub
     
    End Class
     
    Public Class ComboWithClickEventCell
        Inherits DataGridViewComboBoxCell
     
        Public Shared Event ValueChanged(ByVal NewValue As String)
     
        Public Overrides Sub InitializeEditingControl(ByVal rowIndex As Integer, _
            ByVal initialFormattedValue As Object, _
            ByVal dataGridViewCellStyle As DataGridViewCellStyle)
     
            MyBase.InitializeEditingControl(rowIndex, initialFormattedValue, _
                dataGridViewCellStyle)
     
            Dim ctl As ComboWithClickEventEditingControl = _
                CType(DataGridView.EditingControl, ComboWithClickEventEditingControl)
            If Not IsDBNull(Me.Value) Then
                ctl.Text = CType(Me.Value, String)
                AddHandler ctl.ValueChanged, AddressOf Me.OnValueChanged
            End If
        End Sub
     
        Public Overrides ReadOnly Property EditType() As Type
            Get
                Return GetType(ComboWithClickEventEditingControl)
            End Get
        End Property
     
        Private Sub OnValueChanged(ByVal NewValue As String)
            RaiseEvent ValueChanged(NewValue)
        End Sub
     
    End Class
     
    Public Class ComboWithClickEventColumn
        Inherits DataGridViewComboBoxColumn
     
        Public Event ValueChanged(ByVal NewValue As String)
     
        Public Sub New()
            MyBase.New()
            MyBase.CellTemplate = New ComboWithClickEventCell
     
            AddHandler ComboWithClickEventCell.ValueChanged, AddressOf OnValueChanged
        End Sub
     
        Public Overrides Property CellTemplate() As DataGridViewCell
            Get
                Return MyBase.CellTemplate
            End Get
            Set(ByVal value As DataGridViewCell)
                If Not (value Is Nothing) AndAlso _
                    Not value.GetType().IsAssignableFrom(GetType(ComboWithClickEventCell)) _
                    Then
                    Throw New InvalidCastException("Doit être ComboWithClickEventCell")
                End If
                MyBase.CellTemplate = value
            End Set
        End Property
     
        Private Sub OnValueChanged(ByVal NewValue As String)
            RaiseEvent ValueChanged(NewValue)
        End Sub
     
    End Class
     
    #End Region
    Et l'utilisation dans une form contenant le DGV :
    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
     
        Public Sub New()
            ' Cet appel est requis par le Concepteur Windows Form.
            InitializeComponent()
     
            Dim dt As New DataTable
            dt.Columns.Add("c1")
            dt.Rows.Add("jlkjkljkl")
            dt.Rows.Add("dkjlkdsjflkdscqsdf")
            dt.Rows.Add("98798798789")
            dt.Rows.Add("zehzàçt_iàç")
            dt.Rows.Add("099098UHKJHBJK")
     
            Dim c As New ComboWithClickEventColumn
            c.DataSource = dt
            c.DisplayMember = "c1"
            c.ValueMember = "c1"
            AddHandler c.ValueChanged, AddressOf ValueChanged
            Me.DataGridView1.Columns.Add(c)
     
        End Sub
     
        Private Sub ValueChanged(ByVal t As String)
            MsgBox(t)
        End Sub
    Cdt.
    Bon à savoir : la touche F1 ne sert pas à commander des places pour le grand prix de Belgique.

  5. #5
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 184
    Points : 619
    Points
    619
    Par défaut
    Vraiment merci beaucoup
    Je ne vais pas pouvoir tester cela aujourd'hui car je dois mettre ma formation à vb.net entre parenthèses pour 'travailler' vraiment.
    Je m'y remets la semaine prochaine

  6. #6
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 776
    Points
    1 776
    Par défaut
    Bonjour.

    Je me suis rendu compte que tel que le code n'était pas des plus fonctionnel ... car les events se retrouvent levés de maniére étrange...

    Il semble en effet que le DGV joue sur l'editingcontrol même quand la cellule n'est pas active...

    Je vais creuser un peu et je poste un solution acceptable dés que possible.

    Cdt.
    Bon à savoir : la touche F1 ne sert pas à commander des places pour le grand prix de Belgique.

  7. #7
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 776
    Points
    1 776
    Par défaut
    Bonjour.

    En fait, il ne manquait que le désabonnement à l'event lorsque la celulle quitte le mode d'édition.

    Cela doit maintenant fonctionner :
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
     
    #Region "ComboWithClickEvent COLUMN"
     
    Public Class ComboWithClickEventEditingControl
        Inherits DataGridViewComboBoxEditingControl
        Implements IDataGridViewEditingControl
     
        Public Event ValueChanged(ByVal NewValue As String)
     
        Protected Overrides Sub OnSelectedIndexChanged(ByVal e As System.EventArgs)
            MyBase.OnSelectedIndexChanged(e)
            RaiseEvent ValueChanged(Me.Text)
        End Sub
     
    End Class
     
    Public Class ComboWithClickEventCell
        Inherits DataGridViewComboBoxCell
     
        Public Shared Event ValueChanged(ByVal NewValue As String)
        Private ctl As ComboWithClickEventEditingControl
     
        Public Overrides Sub InitializeEditingControl(ByVal rowIndex As Integer, _
            ByVal initialFormattedValue As Object, _
            ByVal dataGridViewCellStyle As DataGridViewCellStyle)
     
            MyBase.InitializeEditingControl(rowIndex, initialFormattedValue, _
                dataGridViewCellStyle)
     
            ctl = _
                CType(DataGridView.EditingControl, ComboWithClickEventEditingControl)
            If Not IsDBNull(Me.Value) Then
                ctl.Text = CType(Me.Value, String)
                AddHandler ctl.ValueChanged, AddressOf Me.OnValueChanged
            End If
        End Sub
     
        Public Overrides Sub DetachEditingControl()
            RemoveHandler ctl.ValueChanged, AddressOf Me.OnValueChanged
            MyBase.DetachEditingControl()
        End Sub
     
        Public Overrides ReadOnly Property EditType() As Type
            Get
                Return GetType(ComboWithClickEventEditingControl)
            End Get
        End Property
     
        Private Sub OnValueChanged(ByVal NewValue As String)
            RaiseEvent ValueChanged(NewValue)
        End Sub
     
    End Class
     
    Public Class ComboWithClickEventColumn
        Inherits DataGridViewComboBoxColumn
     
        Public Event ValueChanged(ByVal NewValue As String)
     
        Public Sub New()
            MyBase.New()
            MyBase.CellTemplate = New ComboWithClickEventCell
     
            AddHandler ComboWithClickEventCell.ValueChanged, AddressOf OnValueChanged
        End Sub
     
        Public Overrides Property CellTemplate() As DataGridViewCell
            Get
                Return MyBase.CellTemplate
            End Get
            Set(ByVal value As DataGridViewCell)
                If Not (value Is Nothing) AndAlso _
                    Not value.GetType().IsAssignableFrom(GetType(ComboWithClickEventCell)) _
                    Then
                    Throw New InvalidCastException("Doit être ComboWithClickEventCell")
                End If
                MyBase.CellTemplate = value
            End Set
        End Property
     
        Private Sub OnValueChanged(ByVal NewValue As String)
            RaiseEvent ValueChanged(NewValue)
        End Sub
     
    End Class
     
    #End Region
    Cdt.
    Bon à savoir : la touche F1 ne sert pas à commander des places pour le grand prix de Belgique.

  8. #8
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 184
    Points : 619
    Points
    619
    Par défaut
    J'ai ajouté un module de classe à mon projet et j'y ai copié le code modifié par Olsimare

    Par contre je n'avais pas créé mes colonnes par du code mais via la fenêtre de rpopriétés sur la ligne collection Columns de l'objet DataGridView
    Maintenant en type d'objets possibles pour une colonne je vois bien une nouvelle ligne ComboWithClickEventColumn

    Ce que je ne sais pas faire c'est où ajouter la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      AddHandler c.ValueChanged, AddressOf ValueChanged
    Faut-il vraiment ne travailler que par code dans mon cas ou est-il possbile d'utiliser le EditingControlShowing de la DataGridView ?

  9. #9
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 776
    Points
    1 776
    Par défaut
    Bonjour.

    Tu peux parfaitement mettre l'abonnement à l'évènement dans l'event editingcontrolshowing du DGV.

    Par contre, il faudra aussi gérer le désabonnement une fois la cellule/colonne quittée donc je te conseillerai plutôt de mettre ça dans le ColumnAdded --> si la colonne est du type ComboWithClickEventColumn, tu t'abonnes à l'event, sinon tu fais rien.

    Pour le désabonnement, même chose mais dans le ColumnRemoved

    Cdt.
    Bon à savoir : la touche F1 ne sert pas à commander des places pour le grand prix de Belgique.

  10. #10
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 184
    Points : 619
    Points
    619
    Par défaut
    J'ai écrit ceci par rapport à ce que disait olsimare
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
           If e.Column.GetType.Name = "ComboWithClickEventColumn" Then
                AddHandler e.Column.ValueChanged, AddressOf ValueChanged
            End If
    Le Name est bien testé.
    Par contre je ne sais pas quel évènement tester derrière e.Column.
    Ici e.Column.ValueChanged provoque une erreur

  11. #11
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 776
    Points
    1 776
    Par défaut
    Bonjour.

    Il faut "caster" la colonne pour que cela fonctionne.

    Exemple d'un DGV qui s'inscrit à l'event de lui même :
    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 DGVDelphine
        Inherits DataGridView
     
        Protected Overrides Sub OnColumnAdded(ByVal e As System.Windows.Forms.DataGridViewColumnEventArgs)
            MyBase.OnColumnAdded(e)
            If GetType(ComboWithClickEventColumn).IsAssignableFrom(e.Column.GetType) Then
                AddHandler CType(e.Column, ComboWithClickEventColumn).ValueChanged, AddressOf ValueChanged
            End If
        End Sub
        Private Sub ValueChanged(ByVal t As String)
            MsgBox(t)
        End Sub
     
    End Class
    Cdt.
    Bon à savoir : la touche F1 ne sert pas à commander des places pour le grand prix de Belgique.

  12. #12
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 184
    Points : 619
    Points
    619
    Par défaut
    Ca marche et je suis vraiment content
    Merci beaucoup

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

Discussions similaires

  1. [Débutant] Récupérer une valeur d'une combobox via une SortedList
    Par smurfing dans le forum VB.NET
    Réponses: 1
    Dernier message: 18/03/2013, 13h32
  2. Comment faire une recherche dans une combobox et une sélection automatique
    Par VictoriusDan dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 11/12/2009, 16h17
  3. avec click sur un lien, ouvrir une image dans une page html
    Par Bydouille dans le forum Général JavaScript
    Réponses: 20
    Dernier message: 17/10/2007, 20h40
  4. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48
  5. Réponses: 2
    Dernier message: 17/04/2007, 17h14

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