Accueil
Accueil Le Club Delphi Kylix C C++ Java J2EE DotNET & C# Visual Basic Access Pascal Dev Web PHP ASP XML UML SQLSGBD Windows Linux Autres
logo

precedent    sommaire    suivant   


Comment limiter le nombre de selections d'une ListeBox ?
auteur : Maxence HUBICHE
Dans l'évènement Avant Mise à jour de votre liste, collez ceci (en prenant soin de remplacer lstChamps par le nom de votre zone de liste) :
    On Error GoTo GestErr
   
    Static lngItems()  As Long
    Dim lngLoop     As Long
    Dim varItems    As Variant
   
    lstChamps.Selected(0) = False
    lstChamps.Selected(1) = False
    If lstChamps.ItemsSelected.Count > 10 Then
        Cancel = True
        'désactiver tous les champs
        For lngLoop = 2 To lstChamps.ListCount - 1
            lstChamps.Selected(lngLoop) = False
        Next
        'réactiver uniquement la sélection précédente
        For lngLoop = 0 To UBound(lngItems)
            lstChamps.Selected(lngItems(lngLoop)) = True
        Next
    Else
        'redéfinir la sélection en cours
        ReDim lngItems(lstChamps.ItemsSelected.Count - 1)
        For lngLoop = 0 To lstChamps.ItemsSelected.Count - 1
            lngItems(lngLoop) = lstChamps.ItemsSelected(lngLoop)
        Next
        Cancel = False
    End If
FinProg:
    Exit Sub
GestErr:
    If Err.Number = 91 Then
        For lngLoop = 0 To lstChamps.ListCount
            lstChamps.Selected(lngLoop) = False
        Next
    End If
    Resume FinProg 

Ajouter Tous en haut d'une liste déroulante
auteur : FRED.G

Pour ajouter "[Tous]" (ou tout autre texte) en premier choix d'une zone de liste (déroulante ou pas), il est possible d'utiliser une requête UNION dans la propriété Contenu (RowSource) du contrôle.

Imaginons que l'on veuille afficher et trier toutes les valeurs du champ Champ1 de la table Table1, mais faire précéder ces valeurs par la mention "[Tous]", le SQL notre requête pourrait être :

SELECT A.Champ1 
FROM (SELECT B.Champ1, 1 AS IndexTri FROM Table1 AS B
Union 
SELECT TOP 1 "[Tous]", 0 FROM Table1 AS C) AS A
ORDER BY A.IndexTri, A.Champ1
Remarque : pour optimiser les performances on peut, le cas échéant, créer une table permanente (appelons la TableListe) avec les deux champs suivants :
  • EnTête (Type : String; Null Interdit : Oui; Chaine vide autorisée : Non; Index : Sans doublon),
  • IndexTri (Type : Byte; Null Interdit : Oui; Valeur par défaut : 0; Valide Si : =0)
On utilise cette table en créant un enregistrement pour chaque valeur d'entête que l'on veut rendre disponible dans sa base, par exemple :

[Tous]
[Toutes]
[Aucun]
... 
Ensuite, le SQL de notre requête Union servant pour la source de nos listes ressemblera à :

SELECT A.Champ1 
FROM (SELECT B.Champ1, 1 AS Position FROM Table1 AS B
Union 
SELECT TableListe.Entête, TableListe.IndexTri FROM TableListe WHERE TableListe.Entête="[Tous]") AS A
ORDER BY A.IndexTri, A.Champ1

A noter aussi, concernant les performances, que d'une manière générale, pour les requêtes complexes
ou ciblant plusieurs dizaines ou centaines de milliers d'enregistrements, il est préférable
d'enregistrer sa requête plutôt que d'exécuter à la volée son équivalent SQL
(si les tables sources bénéficient d'indexes). Dans ce dernier cas, on n'écrira plus l'instruction
SQL dans la propriété RowSource de la zone de liste, mais simplement le nom de la requête enregistrée.


Comment remplir dynamiquement une liste déroulante avec les années ?
auteur : Starec
Le but d'une application est de durer dans le temps, sans avoir à retoucher le code à chaque changement d'année.
Souvent on choisit une année à l'aide d'une liste déroulante, ce que l'on fait c'est que dans la propriété contenu (RowSource) on saisi les années.
Ce que je vous propose, c'est que cela soit fait automatiquement.
Dans les deux cas que je vais vous proposer, il faut que la propriété Origine Source de la liste déroulante soit à Listes Valeurs.


Version Access 2002, 2003 :
Private Sub cboAnnee_GotFocus()
    Dim i As Integer
    Me.cboAnnee.RowSource = ""
    For i = 1 To 5
        Me.cboAnnee.AddItem Year(DateAdd("yyyy", i - 2, Date))
    Next i        
End Sub

Version Access 97 et 2000 :

Je vous propose cette version, car la méthode Additem n'est apparue qu'à partir de 2002.
Private Sub cboAnnee2_GotFocus()
    Dim i As Integer
    Dim strSource As String
    For i = 1 To 5
        strSource = strSource & ";" & Year(DateAdd("yyyy", i - 2, Date))
    Next i
    Me.cboAnnee2.RowSource = Right(strSource, Len(strSource) - 1)
End Sub
Ces exemples vont vous donner 5 années, de 2006 à 2010, l'année prochaine en 2008, vous aurez donc de 2007 à 2011.


precedent    sommaire    suivant   

Consultez les autres F.A.Q's


Les sources présentés sur cette pages sont libre de droits, et vous pouvez les utiliser à votre convenance. Par contre cette page de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright ©2004  Developpez LLC. Tout droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérets. Cette page est déposée à la SACD.

Vos questions techniques : forum d'entraide Accueil - Publiez vos articles, tutoriels, cours et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones. Nous contacter - Copyright 2000..2005 www.developpez.com