ComboBox Data Bound ou non ?

Résolu
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 - 19 nov. 2012 à 10:01
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 - 20 nov. 2012 à 07:52
Bonjour,

J'ai une question toute simple à propos du contrôle ComboBox.
Je l'utilise assez peu du à des comportements erratiques qui ne me conviennent pas, mais dans une appli j'aimerais assigner à sa propriété DataSource un Recordset.

Cette propriété existe dans l'intellisense mais n'est pas mentionnée dans l'aide. Alors ce contrôle est-il ou non liable aux données ???

Je précise que je n'utilise jamais le contrôle ADO, mais que je créé ses objets directement dans l'appli.

Merci de votre aide.


Calade

16 réponses

Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
19 nov. 2012 à 11:49
Simplement pouvoir choisir un dossier parmi ceux existant sur le disque dur et permettre d'en ajouter un si nécessaire.

Une solution moins chère. Evidemment,le combobox natif aurait été parfait en récupérant les dossiers existants dans un tableau.

Le problème est le comportement de ce contrôle lors de la saisie. En fait il affiche les dossiers déjà existants et quand tu fais Enter pour valider la saisie d'un nouveau dossier, il récupère en fait le plus proche existant déjà.
De plus c'est un vieux code qui ne tournera que sur une seule machine (celle de ma mère - 86 ans) pour tout t'avouer et ce sont des comportements perturbants.
Il y a longtemps que je me heurte à ce problème sur les combos. Le plus simple est que je m'en paluche un que je pourrais intégrer dans mes applis.

PS:
L'appli que j'écris pour ma mère ne tournera QUE sur une seule machine, mais le code à l'intérieur (la combo en l'occurence) sera certainement répercutée à l'envie.

En tout cas merci de ton aide.


Calade
3
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
19 nov. 2012 à 10:05
Re Bonjour,

Je précise que j'obtiens une erreur "Méthode ou membre de données introuvable" avec la propriété .Datasource en surbrillance alors que le debugguer s'arrête sur l'entête de la procédure.


Calade
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 nov. 2012 à 10:13
Bonjour, Calade :
Lecture de l'aide VB :
To complete the connection with a field in the Recordset managed by the Data control, you must also provide the name of a Field object in the DataField property. Unlike the DataField property, the DataSource property setting isn't available at run time.

Regarde ce que j'ai souligné et mis en rouge
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
19 nov. 2012 à 10:19
Bonjour ucFoutu et merci de ta réponse,

Si je comprends bien, le recordset doit être liée à la conception, ce qui est (très) loin d'être toujours possible et rigoureusement impossible dans mon cas.
Est-il possible d'assigner un recordset au run-time ?

Je n'avais pas mis mon code, mais le Datafield était bien assignée, mais peut-être n'as-tu pas vu mon 2ème mail qui expliquait un peu plus. Désolé.


Calade
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 nov. 2012 à 10:28
1As-tu ajouté le control Data nécessaire ?
Si oui : comment as-tu ajusté ses propriétés relatives à la connexion, à la base, etc ???
C'est à cela, qu'est "liée" ta combo, pas directement à ta base.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
19 nov. 2012 à 10:43
Je n'utilise pas de contrôle Data, jamais d'ailleurs.
Je créé une référence à msador.dll (de mémoire) et je code la création de mes connexions et autres recordsets. Avec ça, sur un datagrid il suffit de lier la propriété DataSource.

S'il faut utiliser un contrôle Data, cela suppose une base de données, or dans ce cas, les données ne sont pas en base (ce sont des noms de dossiers en fait) trouvés au run-time puisque dépendant de la machine et que je stocke dans un recordset déconnecté.


Calade
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 nov. 2012 à 11:40
Comme dit plus haut : la liaison d'une combo n'est possible qu'au travers d'un control data.
Et si tu expliquais maintenant exactement ce que tu veux faire ? il y a vraisemblablement une solution moins "chère"


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 nov. 2012 à 12:04
cela :
et quand tu fais Enter pour valider la saisie d'un nouveau dossier, il récupère en fait le plus proche existant déjà

semble être ton voeu.
Explique ce que tu entends par "récupère le plus proche existant déjà".
J'ai du mal à comprendre ce que tu veux faire.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
19 nov. 2012 à 12:32
et quand tu fais Enter pour valider la saisie d'un nouveau dossier, il récupère en fait le plus proche existant déjà

Simplement qu'il inscrit dans la zone de saisie ce qui se rapproche le plus de ce que j'ai saisi sans tenir compte de celle-ci.

Calade
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 nov. 2012 à 13:02
Je ne te comprends toujours pas !
Dans une combobox, on clique sur ce que l'on choisit, normalement.
Explique-moi avec clarté de "mécanisme" de "facilité" que tu "entrevois". Il m'échappe d'autant que tu me donnes l'impression, au nom de la "facilité", de forcer ta mère âgée à écrire plutôt qu'à cliquer. !
Je ferais, s'agissant d'une personne âgée, exactement le contraire :
1) je ne lui permettrais même pas de frapper quoi que ce fût dans la zone de saisie, la forçant à faire son choix par click dans la zone de choix.
2) je lui demanderais alors (et seulement après ce choix ainsi fait) si elle "retient" ce répertoire ou si elle veut y ajouter un sous-dossier ===>> et si Oui ===> inputbox pour le nommer et le créer sous ce nom.
Enfin ... Regarde mon âge personnel ... et évite :
- de décider à la place des plus âgés de ce qui leur convient le mieux
- de leur compliquer l'existence au prétexte que tu crois, toi, que tu leur offres une convivialité qui s'écarte finalement de la raison la plus simple.
Crois-moi : contrairement à ce que tu penses, l'expérience (du moins celle du vieux crouton que je suis) conduit à constater que les très jeunes (de 6 à 8 ans) et les plus âgés (au-delà de 75 ans) comprennent bien mieux les mécanismes instinctifs que ceux résultant de "fausses aides" !!!

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
19 nov. 2012 à 13:11
Je ne cherche pas à lui faire saisir qui que ce soit, SAUF si le dossier n'existe pas et alors il faut bien lui donner un nom.
Quant à la solution de l'Inputbox, j'ai toujours fait comme s'il n'existait pas car on n'a aucun contrôle dessus (positionnement, taille et contrôle à posteriori - même si dans ce cas, ce serait forcément du texte).

Quant à la facilité d'utilisation, elle a déjà vu une version bêta qui lui convient très bien, ce comportement signalé ci-dessus mis à part.


Calade
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 nov. 2012 à 13:14
Bien !
Montre cette version bêta (son code) en y pointant la réaction (partie du code) qui ne te plait pas. On comprendra alors mieux et on te proposera du plus "sûr".


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 nov. 2012 à 13:22
Et : tu sais quoi, à propos de InputBox ?
j'ai toujours fait comme s'il n'existait pas car on n'a aucun contrôle dessus (positionnement, taille et contrôle à posteriori

Ce sont là tes seules affirmations et elles ne sont NULLEMENT fondées !!!

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
19 nov. 2012 à 13:46
1) Autant pour moi pour le positionnement, mais pas pour le contrôle a posteriori (vérif de la saisie).

2) Voici mon code, je te mets le .frm en entier pour que tu puisses voir les propriétés du combo par défaut. Les lignes commentées servent à peupler le combo avec une liste de dossiers que je parcoure et récupère dans un tableau. Tu vas être obligé d'en faire une à la main puisque j'utilise une DLL maison pour ce faire.

VERSION 5.00
Begin VB.Form Form2 
   Caption         =   "Form2"
   ClientHeight    =   3195
   ClientLeft      =   60
   ClientTop       =   345
   ClientWidth     =   4680
   LinkTopic       =   "Form2"
   ScaleHeight     =   3195
   ScaleWidth      =   4680
   StartUpPosition =   3  'Windows Default
   Begin VB.ComboBox cboFolders 
      Height          =   315
      Left            =   360
      TabIndex        =   0
      Text            =   "cboFolders"
      Top             =   480
      Width           =   3975
   End
End
Attribute VB_Name = "Form2"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit

Private P_aSlideFolders() As String                                   ' Array of Folders for SlideShow

Private Sub Form_Load()
'   Dim oFolders As New BH_CScanDrives
   Dim strRootFolder As String
   
   strRootFolder = "D:\Graphics\Personnal"
   cboFolders.Clear:                                                 ReDim P_aSlideFolders(0) As String
   cboFolders.AddItem "Choisir dans la liste ci-dessous"
'   oFolders.Flags = sfoFoldersOnly + sfoIgnoreGhostFolder
'   Do While oFolders.ScanDrive(strRootFolder)
'      If oFolders.FileIsMatching Then
         cboFolders.AddItem                           'Le nom du Dossier ici
         ReDim Preserve P_aSlideFolders(BH_UBound(P_aSlideFolders) + 1)
         P_aSlideFolders(BH_UBound(P_aSlideFolders)) = 'Le nom du Dossier ici
      End If
   Loop
   cboFolders.ListIndex = 0
End Sub

Public Function BH_UBound(SArray As Variant) As Long
   On Error GoTo EmptyArray
   BH_UBound = UBound(SArray)
   Exit Function
   
EmptyArray:
   BH_UBound = -1
End Function


3) Le comportement:
Si tu veux ajouter un dossier (donc le créer) tu commences à saisir (OK)
Si au fur et à mesure de la saisie, il existe une correspondance (même partielle) avec un dossier existant, quand tu fais Enter, c'est le nom du dossier existant qui s'affichera (c'est pas ça que je veux).
Si aucune correspondance n'existe, alors pas de problème.

Exemple:
Dans les dossiers existants il y a "Angleterre", si tu commences à saisir "an", le 1er visible sera "Angleterre" (OK) mais si tu fais Enter, tu vois apparaître ce dossier (et si tu veux créer un dossier nommé "an", problème.
Je ne sais pas si je suis bien clair.

Calade
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 nov. 2012 à 18:50
Désolé, mais ce bout de code ne permet pas de voir grand-chose de ton mécanisme !
On ne sait même pas comment et par quoi est remplie la combo au départ !
Et essaye de présenter du "propre". Ce que tu montres, avec ses lignes commentées aboutit par exemple à un Loop sans Do, un End If sans If ...

Je me demande si tu ne ferais pas mieux de nous exposer les tenants et aboutissants en langage naturel ===>> exposé technique succinct de ce qui est offert au départ dans la combo, des gestes attendus de l'utilisateur et des résultats souhaités

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
20 nov. 2012 à 07:52
Je te l'ai dit, ma combo est rempli par une suite de sous-dossiers appartenant tous tous au même dossier parent. Cette liste est fourni par une DLL maison (d'où les commentaires). si ceux-ci te perturbent dans les Do et IF non terminés, voici le bout de code mieux fini:
'   oFolders.Flags = sfoFoldersOnly + sfoIgnoreGhostFolder
'   Do While oFolders.ScanDrive(strRootFolder)
'      If oFolders.FileIsMatching Then
         cboFolders.AddItem                           'Le nom du Dossier ici
         ReDim Preserve P_aSlideFolders(BH_UBound(P_aSlideFolders) + 1)
         P_aSlideFolders(BH_UBound(P_aSlideFolders)) = 'Le nom du Dossier ici
 '     End If
 '  Loop
   cboFolders.ListIndex = 0


Comme tu le vois j'itère les dossiers pour éventuellement les intégrer un à un dans ma combo par AddItem.
Tu peux faire une liste en dur contenus dans un tableau que tu assigneras par myCombo.List = monTableau_de_dossiers

A partir de là les essais sont identiques. Il y a belle lurette que j'ai vérifiés ma liste et elle est hors de cause. Cette DLL étant employé dans moult applicatifs.

Comme j'ai horreur de réinventer la roue, j'ai beaucoup de DLL pour réutiliser du code/des routines (un peu à la manière de Windows, toutes proportions gardées évidemment).
Calade
0
Rejoignez-nous