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 :

Evenements sur les éléments d'une ComboBox


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2005
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 12
    Points : 11
    Points
    11
    Par défaut Evenements sur les éléments d'une ComboBox
    Bonjour,

    Cela fait plusieurs jours que je cherche s'il existe des évenement sur les éléments d'une ComboBox. D'après mes recherches cela ne serait pas possible car les éléments d'une ComboBox sont considérer comme des objets de classe Object et la classe Object n'a pas d'évenements.

    Donc je voudrais savoir si il est tout de même possible de réaliser une fonction qui permettrait de pouvoir déclencher une action sur le survol des éléments de ma ComboBox ( ça doit être possible vu que les élements se mettent en surbrillance lorsqu'on les survols ) ou si je dois laisser tomber.

    Je précise que je suis contraint de développer avec le Framework 1.1.

    Toutes les pistes de réflexion seront les bienvenues

  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.

    Une bien belle question !

    Non, tu n'auras effectivement pas d'évènement disponible "nativement" pour les items d'une combo.

    C'est logique car la liste d'item est hétérogéne : tu ne sais donc pas à priori le type des objets qu'elle contient (d'où le type object ...). Ce qui induit que tu ne sais pas si ces items mettrons à disposition une sub qui te permettrais de lever un event du style "j'ai la souris sur moi dans la list d'un combo".

    Par contre, tu peux ruser, en utilisant par exemple un combo personnalisé qui appellerait la levée d'un event donné lors du dessin de l'item dans le DrawItem, si cette item est d'un type donné ou implémente une interface donnée.

    Pour illustrer car c'est un peu obscur dit comme cela, imaginons l'exemple suivant :
    Je veux :
    - un combo qui contient une liste de voitures et de motos
    - que le type de vehicule mis en evidence dans la liste du combo soit affiché dans un label.

    Je créé un classe abstraite Vehicule qui léve un événement partagé "Le type de véhicule à changé", qui oblige ses héritiers a définir une proc "changer le type de véhicule" et qui implémente une interface IWithItemEvent avec une proc "La souris est entrée sur un item".

    Je défini 2 classes, auto et moto qui héritent de vehicule.

    Je créé un combo qui lors du dessin d'un item de la liste, si cette item implémente l'interface IWithItemEvent déclenche la proc "changer le type de véhicule" de cet item.

    En code cela va donner :
    Les classes vehicule, moto, auto et combo qui va bien :
    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
     
    Public Interface IWithItemEvent
        Sub OnMouseEnterItem()
    End Interface
     
    Public MustInherit Class Vehicule
        Implements IWithItemEvent
        Public Shared Event MouseOverVehiculeTypeChanged(ByVal NewDescription As String)
        Private Shared strVehiculeWithMouseOverType As String
        Protected Sub SetVehiculeWithMouseOverType(ByVal strVehiculeWithMouseOverType As String)
            RaiseEvent MouseOverVehiculeTypeChanged(strVehiculeWithMouseOverType)
        End Sub
        Public MustOverride Sub OnMouseEnterItem() Implements IWithItemEvent.OnMouseEnterItem
     
        Private strName As String
        Public Property Name() As String
            Get
                Return strName
            End Get
            Set(ByVal value As String)
                strName = value
            End Set
        End Property
        Public Overrides Function ToString() As String
            Return strName
        End Function
    End Class
     
    Public Class Auto
        Inherits Vehicule
        Public Sub New(ByVal vName As String)
            Me.Name = vName
        End Sub
        Public Overrides Sub OnMouseEnterItem()
            Me.SetVehiculeWithMouseOverType("Je suis une voiture")
        End Sub
    End Class
     
    Public Class Moto
        Inherits Vehicule
        Public Sub New(ByVal vName As String)
            Me.Name = vName
        End Sub
        Public Overrides Sub OnMouseEnterItem()
            Me.SetVehiculeWithMouseOverType("Je suis une moto")
        End Sub
    End Class
     
     
    Public Class ComboWithItemEvent
        Inherits ComboBox
     
        Public Sub New()
            ' Permet de lever l'event DrawItem
            Me.DrawMode = Windows.Forms.DrawMode.OwnerDrawFixed
        End Sub
     
        Private MouseOverItemIndex As Integer = -1
        Protected Overrides Sub OnDrawItem(ByVal e As System.Windows.Forms.DrawItemEventArgs)
            MyBase.OnDrawItem(e)
     
            If e.Index >= 0 Then
                e.DrawBackground()
                e.DrawFocusRectangle()
     
                e.Graphics.DrawString(Me.Items(e.Index).ToString, Me.Font, New SolidBrush(e.ForeColor), _
                    New RectangleF(1, e.Bounds.Y + 1, _
                    e.Bounds.Width, e.Bounds.Height))
     
                ' si l'item est celui sélectionné --> la souris est dessus
                If (e.State And DrawItemState.Selected) = DrawItemState.Selected Then
                    MouseOverItemIndex = e.Index
                    Dim s As String = Me.Items(e.Index).GetType.Name
                    If GetType(IWithItemEvent).IsAssignableFrom(Me.Items(e.Index).GetType) Then
                        CType(Me.Items(e.Index), IWithItemEvent).OnMouseEnterItem()
                    End If
                End If
            End If
     
        End Sub
     
    End Class
    Et un form avec le combo perso défini plus haut et un label :
    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 Form8
     
        Public Sub New()
     
            InitializeComponent()
     
            Me.ComboWithItemEvent1.Items.Add(New Moto("Honda 500"))
            Me.ComboWithItemEvent1.Items.Add(New Auto("Jaguar MX5"))
            Me.ComboWithItemEvent1.Items.Add(New Auto("Opel Corsa OPC"))
            Me.ComboWithItemEvent1.Items.Add(New Moto("BMW 1200"))
            Me.ComboWithItemEvent1.Items.Add(New Moto("Ninja 1100"))
            Me.ComboWithItemEvent1.Items.Add(New Auto("Phantom"))
     
            AddHandler Vehicule.MouseOverVehiculeTypeChanged, AddressOf VehicleTypeChanged
     
        End Sub
     
        Private Sub VehicleTypeChanged(ByVal NewDescription As String)
            Me.Label1.Text = NewDescription
        End Sub
    End Class
    Voilà, c'est ce qui me semble le plus simple pour faire ce que tu veux (si j'ai bien compris).

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

  3. #3
    Membre à l'essai
    Inscrit en
    Décembre 2005
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    Bonjour olsimare,

    Merci bien pour ta réponse. J'ai testé ton code et c'est exactement ce que je voulais faire. Ces jours de recherches sont enfin fructueux

    Pour moi cette affaire est résolue.

    Encore merci

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

Discussions similaires

  1. Travail sur les éléments d'une matrice.
    Par Jefeh dans le forum MATLAB
    Réponses: 6
    Dernier message: 12/11/2007, 15h10
  2. retirer les élément d'une combobox
    Par Shikamaru86 dans le forum C++Builder
    Réponses: 1
    Dernier message: 20/07/2007, 11h03
  3. Réponses: 1
    Dernier message: 09/05/2007, 15h58
  4. Focus sur un élément d'une combobox
    Par zoidy dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 21/06/2006, 18h17
  5. Cacher les éléments d'une ComboBox ?
    Par Alexino2 dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 20/05/2006, 14h56

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