Selecteur alphanumerique (vb.net 2010

Soyez le premier à donner votre avis sur cette source.

Vue 4 007 fois - Téléchargée 389 fois

Description

Selecteur Alphanumerique. Affiche les Lettres de A à Z et permet d'executer une action, en cliquant sur l'une d'elles.

Source / Exemple :


Public Class Form1
    Dim MesLettres As New Collection
    '
    Private Sub ClickMesLettres(ByVal sender As System.Object, ByVal e As System.EventArgs)
        For i = 1 To MesLettres.Count
            With MesLettres(i)
                If .name = sender.name Then
                    .backcolor = Color.LightGreen
                    .forecolor = Color.Red
                    ExecutionSelecteur(i)
                Else
                    .forecolor = Color.Black
                    .backcolor = Me.BackColor
                End If
            End With
        Next i
    End Sub

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        For i As Integer = 0 To 25
            Dim x As New Label
            x.Name = "Lettre" & Str(Asc("A") + i)
            Controls.Add(x)
            x.Left = 10 + i * 25
            x.Top = 20
            x.Width = 20
            x.Text = Chr(Asc("A") + i)
            x.Font = New Font("Arial", 12, FontStyle.Bold)
            x.TextAlign = ContentAlignment.MiddleCenter
            MesLettres.Add(x)
            AddHandler x.Click, AddressOf ClickMesLettres
        Next
    End Sub
    Private Sub ExecutionSelecteur(I As Integer)
        MessageBox.Show("vous avez cliqué sur la case " & Chr(64 + I), "", MessageBoxButtons.OK)
        'Placez ici le traitement de chaque bouton
        'Exemple :
        'Select Case Chr(64 + I)
        '    Case "A"
        '    Case "B"
        '        ' etc...
        'End Select

    End Sub
End Class

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Adn56
Messages postés
1220
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1 -
Pour moi à cette heure, l'utilisation présenté ci dessus n'est pas "propre", il vaut mieux faire ainsi :

1-supprimer meslettres qui ne me semble pas utile
2-écrire la sub comme suit :
Private Sub ClickMesLettres(ByVal sender As System.Object, ByVal e As System.EventArgs)
dim lbl as label = directcast(sender, label)
For Each ctrl As Control In Controls 'pour chaque control sur la form
If TypeOf ctrl Is label then
if ctrl.name = sender.name
.forecolor = Color.Black
.backcolor = Me.BackColor
else
.backcolor = Color.LightGreen
.forecolor = Color.Red
ExecutionSelecteur(lbl)
....
...

qu'en penses tu ?
Adn56
Messages postés
1220
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1 -
en effet Henry, mais dans son cas (la source si dessus) je repose donc le cas de la list of label. je m'explique par code.
Si je fais :
' ici avec des boutons pour faire un calendrier (mon prochain dépot de source pour VBfrance)
Private Sub CreerBpMois()
' création dynamique des controls BP et des zones de tags.
' sur 5 lignes et 7 colones
For semaines As Integer = 1 To 6

For jours As Integer = 1 To 7 ' 0=dimanche, 6=samedi et 7=re dimanche
Dim Bp As New Button
With Bp
.Tag = NomJours(jours) & "_" & semaines.ToString & ":" & (7 * (semaines - 1) + jours).ToString
.Size = New Size(60, 24)
.Location = New Point((jours - 1) * (.Size.Width + 1), 20 + semaines * (.Size.Height + 1))
.Name = ""
'.Text = .Tag.ToString 'pour débugage
.Visible = False
.ImageAlign = ContentAlignment.MiddleLeft
.TextImageRelation = TextImageRelation.Overlay
.Font = New Drawing.Font("arial", 8)
.FlatStyle = FlatStyle.Flat
.FlatAppearance.BorderSize = 2
.Cursor = Cursors.Hand
' active le menucontextuel "menu1" à chaque bouton
.ContextMenuStrip = Menu1
End With

' ajoute les évenements
'ici l'événement clik "bouton gauche" (attention le choix du bouton cliqué ne se fait que sur mouse.down pas sur click !)
AddHandler Bp.Click, AddressOf bp_click

'ajoute ces controls à la form
Controls.Add(Bp)
'ajoute ces controls à la liste en mémoire
listeBpJours.Add(Bp)
Next
Next
End Sub 'création des bp invisibles sur 5 lignes et 7 colones

j'archive les références de ces boutons dans la list of T, ok
mais à quoi peut elle bien servir puisque je suis obligé de caster le sender en bouton !

Private Sub bp_click(ByVal sender As Object, ByVal e As System.EventArgs)
For i = 0 To listeBpJours.Count - 1
With listeBpJours(i)
If .Name = sender.Name Then
' cette ligne ci dessus léve une liaison tardive !!!!!!!!!!!!!!!!!!!
End If
End With
Next

End Sub 'clic souris sur un bouton du calendrier actif

Donc si je dois caster autant le faire qu'une fois ! non ?
et donc autant écrire :
Private Sub bp_click(ByVal sender As Object, ByVal e As System.EventArgs) 'Handles listeBpJours(sender).click
Dim Ce_Bp As Button = CType(sender, Button) 'cast le sender en bp
MessageBox.Show(Ce_Bp.Name)

End Sub 'clic souris sur un bouton du calendrier actif

Tu vois ou je veux en venir ?
Pourquoi faire une liste des control créer dynamiquement ?
j'ai reussi à passer à bp_click un button au lieu d'un object, mais il me manque le e.sytemEventArgs, grrrrrrr

comme ceci :

Private Sub bp_click(ByVal sender As Button, ByVal e As System.EventArgs) 'Handles listeBpJours(sender).click
' Dim Ce_Bp As Button = CType(sender, Button) 'cast le sender en bp
' MessageBox.Show(Ce_Bp.Name)
For i = 0 To listeBpJours.Count - 1
With listeBpJours(i)
If .Name = sender.Name Then

End If
End With
Next

End Sub 'clic souris sur un bouton du calendrier actif
cela pourrait marcher sauf que :
AddHandler Bp.Click, AddressOf bp_click 'léve une erreur de convertion implicite ! la boucle est bouclé ?
non pas encore j'ai donc essayé cela :
AddHandler Bp.Click, AddressOf bp_click(Bp, ?????) et là je bloque :/

@ te lire et merci pour tes lectures de mes romans lol
NHenry
Messages postés
14522
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
21 août 2019
133 -
Bonsoir,

Pour ton problème, il y a 3 manière de "caster" :
- CType : Cast de base, tolère la conversion en Int32 vers énumération par exemple
- DirectCast : Convertit le type uniquement si cela correspond exactement (Label hérite de Control, donc, c'est possible, mais pas de conversion de Int32 vers Enum par exemple). Plus rapide de le CType
- TryCast : Essayes de convertir (avec CType), en cas d'échec, retourne False, True sinon.

Faire avec DirectCast est dans ton cas, je pense conseillé

Ces méthodes sont toujours plus rapides que les liaisons tardives.
Adn56
Messages postés
1220
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1 -
Aprés lecture et travail sur ce code proposé, je dois avertir qu'il est rempli de liaison tardive.
Ex : DAns la sub clikmesletres : If .Name = sender.name Then... léve une erreur par exemple.
placer la balise strict à on pour la voir.
je cherche une façon de faire autre que le cast du sender, qui rendrait utile la list of
De plus le AddHandler n'autorise qu'un object pour le sender, donc je ne vois d'autre solution que le caster en label.
@ suivre donc ;)
Adn56
Messages postés
1220
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1 -
Bonjour,
je suis d'accord avec toi mais aussi surpris tout de même de voir de "gros" logiciel qui tourne sous .net (solidworks par exemple). Je pense que je ne dois pas bien l'utiliser.
Je vais faire un test comparatif entre l'utilisation des list of t et la recherche direct dans le container.control. Merci de ta lecture. bonne journée.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.