Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > IHM
IHM Ce forum est dédié aux questions relatives à la création de formulaires et d'états, avec ou sans code VBA, et macros.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/07/2011, 17h26   #1
Membre régulier
 
Homme Michaël
Développeur .NET
Inscription : avril 2008
Messages : 80
Détails du profil
Informations personnelles :
Nom : Homme Michaël
Âge : 30
Localisation : Belgique

Informations professionnelles :
Activité : Développeur .NET
Secteur : Transports

Informations forums :
Inscription : avril 2008
Messages : 80
Points : 84
Points : 84
Par défaut ListBox limitée à 2048 caractères

Bonjour à tous,

j'ai un gros soucis, j'aimerais remplir une listbox avec le contenu d'un répertoire.

j'ai donc un code du style:

Code :
m_pathListBox.RowSource = "path1;path2;path3"
Le problème c'est que pour 3 fichiers comme dans l'exemple ci dessus, ca fonctionne très bien mais mon répertoire contient plus ou moins 12000 fichiers et il s'avère que la chaine introduite dans la rowsource ne peut pas excéder 2048 caractères...

Y'a t'il un moyen de dépasser ces 2048 caractères?
mkl238 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/07/2011, 18h40   #2
Modérateur
 
Homme Daniel
Inscription : juillet 2006
Messages : 1 220
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Âge : 67
Localisation : France

Informations professionnelles :
Secteur : Services à domicile

Informations forums :
Inscription : juillet 2006
Messages : 1 220
Points : 1 631
Points : 1 631
bonsoir,
oui utiliser un champ "mémo"
LE VIEUX est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/07/2011, 18h59   #3
Membre régulier
 
Homme Michaël
Développeur .NET
Inscription : avril 2008
Messages : 80
Détails du profil
Informations personnelles :
Nom : Homme Michaël
Âge : 30
Localisation : Belgique

Informations professionnelles :
Activité : Développeur .NET
Secteur : Transports

Informations forums :
Inscription : avril 2008
Messages : 80
Points : 84
Points : 84
bonsoir,

moui, pour peu que je ne m'y connaisse pas c'est un peu short comme aide:
"utiliser un champs mémo"
On aime laisser planer le mystère à ce que vois .

ceci dit, mes données ne venant pas d'une table, je n'utilise pas de requête sql pour remplir ma listbox, mais bien une liste de valeur "Element1;Element2;Element3;"
mkl238 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/07/2011, 10h09   #4
Modérateur
 
Homme Daniel
Inscription : juillet 2006
Messages : 1 220
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Âge : 67
Localisation : France

Informations professionnelles :
Secteur : Services à domicile

Informations forums :
Inscription : juillet 2006
Messages : 1 220
Points : 1 631
Points : 1 631
Bonjour,
avec mes excuses, j'ai répondu un peu trop vite, l'utilisation de mémo ne correspond effectivement pas à ton problème, meme en passant par une table on ne peut lister de champ de type mémo dans une Zone de Liste.
a priori l'utilisation d'une ZDL déroulante ou non est essentiellement réservée à une sélection rapide d'un élément la limite n'est normalement pas un problème sauf dans ton cas bien sur, tu dois trouver une solution de contournement.
LE VIEUX est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/07/2011, 10h18   #5
Membre émérite
 
Conseil + Formation
Inscription : février 2010
Messages : 583
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Activité : Conseil + Formation

Informations forums :
Inscription : février 2010
Messages : 583
Points : 885
Points : 885
Bonjour

Peut-être ajouter les éléments à une table, elle-même source de la listbox...
78chris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/07/2011, 10h35   #6
Membre régulier
 
Homme Michaël
Développeur .NET
Inscription : avril 2008
Messages : 80
Détails du profil
Informations personnelles :
Nom : Homme Michaël
Âge : 30
Localisation : Belgique

Informations professionnelles :
Activité : Développeur .NET
Secteur : Transports

Informations forums :
Inscription : avril 2008
Messages : 80
Points : 84
Points : 84
arf, j'avais déja lu cette solution mais c'est moche:
- créer une table qui n'a rien avoir avec les autres données de la bd, rien que pour remplir une listBox ...

- insérer les champs dans la table pour ensuite l'interroger.

Avec le problème que si un jour je créée plusieurs listbox susceptible de s'ouvrir en même temps chacune devra avoir sa table... et si un jour access fait une erreur fatale (ce qui arrive 3 fois par jour avec access 97) les tables risquent de ne pas être nettoyées.
mkl238 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/07/2011, 11h07   #7
Membre régulier
 
Homme Michaël
Développeur .NET
Inscription : avril 2008
Messages : 80
Détails du profil
Informations personnelles :
Nom : Homme Michaël
Âge : 30
Localisation : Belgique

Informations professionnelles :
Activité : Développeur .NET
Secteur : Transports

Informations forums :
Inscription : avril 2008
Messages : 80
Points : 84
Points : 84
Bonjour bonjour,

J'ai trouvé la solution pour dépasser la limite des 2048 caractères de la listbox. Non seulement elle est facile à mettre en oeuvre mais en plus elle est performante et elle fonctionnerait toujours (ca reste à prouver).

Il s'avère que la propriété ListBox.RowSourceType peut recevoir en paramètre une fonction Callback.

La signature de la fonction est:

Code :
Function ListFill(ctl As Control, id As Variant, currentRow As Long, currentColumn As Long, actionCode As Integer) As Variant
où:
ctl est le contrôle à mettre à jour (la listbox ou combobox)
id permet de pouvoir utiliser la fonction pour plusieurs contrôles
currentRow est la ligne qu'access va traiter
currentColumn est la colonne qu'access va traiter
actionCode est le code désignant l'action qu'access va effectuer
Voici ma fonction:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Function ListFill(ctl As Control, id As Variant, currentRow As Long, currentColumn As Long, actionCode As Integer) As Variant
    Select Case actionCode
        Case acLBInitialize ' retourner une valeur si on remplis la listbox, 0 ou Null pour ne rien faire
            ListFill = m_elementCount
        Case acLBOpen
            ListFill = Timer ' génération de l'id pour le contrôle remplis
        Case acLBGetRowCount
            ListFill = m_elementCount 'retourner le nombre d'élément à ajouter
        Case acLBGetColumnCount
            ListFill = 1 ' ma listbox a une colonne
        Case acLBGetColumnWidth
            ListFill = -1 ' -1 indique que je veux utiliser la taille de colonne prédéfinie
        Case acLBGetValue
            ListFill = m_elements(currentRow) ' la list box se remplis
        Case acLBEnd ' Un nettoyage s'impose
            m_elementCount = 0
            Erase m_elements
        Case acLBClose
            'si j'avais voulu faire quelque chose à la fermeture de la listbox (donc du formulaire), j'aurais pu le faire ici
    End Select
End Function
j'ai initialisé et remplis mes champs m_elementCount et m_elements (le nombre d'élément et le tableau de string de mes éléments).

voici l'assignation de la fonction callback:

Code :
m_filesPathListBox.RowSourceType = "ListFill"
même pour 12000 éléments, l'affichage est instantané.
mkl238 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/07/2011, 22h41   #8
Membre émérite
 
Conseil + Formation
Inscription : février 2010
Messages : 583
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Activité : Conseil + Formation

Informations forums :
Inscription : février 2010
Messages : 583
Points : 885
Points : 885
Bonjour

Très intéressant : merci d'avoir partagé cette solution.
78chris est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h57.


 
 
 
 
Partenaires

Hébergement Web