Comboxbox Databounded

Signaler
Messages postés
1207
Date d'inscription
dimanche 20 avril 2003
Statut
Membre
Dernière intervention
4 juin 2016
-
Messages postés
1207
Date d'inscription
dimanche 20 avril 2003
Statut
Membre
Dernière intervention
4 juin 2016
-
Bonjour,

J'aimerais savoir si le contrôle ComboBox livré en natif avec VB6 peut être lié à un Recordset ?

Tout simplement parce que ComboBox.Datafield = Recordset.Fields(0).Name échoue ainsi qu'avec ComboBox.DataMember.
"Erreur d'exécution '545'"
"Impossible de lier au champ ou au DataMember/DataField"
Le champ existe bien et n'est pas nul, j'ai vérifié.
Le même code avec un DataCombo marche très bien.

Petite précision le recordset est déconnecté (et ne peut pas être autrement car créé et rempli par code). Je précise que je n'utilise pas de DataEnvironment ou autre contrôle ADO inutiles, simplement la référence à msado15.dll (Microsoft ActiveX Data Objects 2.8 Library).

Question subsidiaire, si je remplace un simple ComboBox par un DataComBo, je n'ai pas de problèmes pour l'affichage de mon champ, par contre je ne peux plus modifier le nombre de lignes affichées par API, la fonction GetWindowLong() revoyant 0 sur le DataComboBox et une valeur utilisable avec le ComboBox.

Merci d'avance pour vos lumières.

Calade

9 réponses


Bonjour,
Oui, ça devrait ressembler à ça:
Dim db As ADODB.Connection
Dim rs As ADODB.Recordset
Set db = New ADODB.Connection
Set rs = New ADODB.Recordset

db.Open "Provider =Microsoft.Jet.OLEDB.4.0;Data Source=c:\project\emp.mdb;"

rs.Open "select * from emp", db, adOpenStatic, adLockOptimistic

Set Combo1.DataSource = rs
Combo1.DataField = "name"
'name et emp à remplacer par le nom de ta table et base de données


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
Messages postés
1207
Date d'inscription
dimanche 20 avril 2003
Statut
Membre
Dernière intervention
4 juin 2016
10
Salut acive et merci de ta réponse,

C'est exactement ça à part qu'il s'agit d'un recordset déconnecté sur un modèle SQL.

Le même code fonctionne sur un Datacombo et non sur un ComboBox classique avec une erreur 545.
Aurais-tu un début de réponse ?


Calade

C'est le résultat de la requête qui va être associé au combo.
Que ce soit en access ou SQL, c'est la même chose (de toute manière c'est une requête SQL).

Par contre :
il s'agit d'un recordset déconnecté sur un modèle SQL
s'il n'est pas connecté ça pose problème.


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
Messages postés
1207
Date d'inscription
dimanche 20 avril 2003
Statut
Membre
Dernière intervention
4 juin 2016
10
s'il n'est pas connecté ça pose problème.


Pourquoi cela poserait-il problème ?
Le contrôle ComboBox simple (et natif) serait-il différent du DataCombo ?

Et il est déconnecté tout simplement parce qu'il est rempli par code et ne s'appuie sur aucune base de données.
Quant à utiliser un tableau (propriété List), je crois qu'il vaut mieux oublier, je ne suis qu'en période d'essai et mon recordset contient plus de 3700 enregistrements !
De toutes façons à mon avis un tableau est beaucoup trop lourd pour se balader dedans comme avec un recordset.

Calade
Messages postés
1207
Date d'inscription
dimanche 20 avril 2003
Statut
Membre
Dernière intervention
4 juin 2016
10
J'ai fait quelques essais complémentaires.

Dans le même contexte j'ai simplement essayé avec un recordset connecté à sa BD, la propriété Datafield achoppe toujours.
Son type étant adVarChar, je l'ai remplacé par adChar (donc en longueur fixe).
J'ai aussi essayé en changeant sa longueur (originellement 255, je l'ai réduit à 50 pour mes essais.

Rien à faire.

D'autres idées ?


Calade

Attends,
il est rempli par code et ne s'appuie sur aucune base de données


Tu ne peux donc pas lui attribuer le datasource.

As-tu fait une recherche sur le site? avec "codes sauf .net" j'ai vu justement quelques exemples.

Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
Messages postés
1207
Date d'inscription
dimanche 20 avril 2003
Statut
Membre
Dernière intervention
4 juin 2016
10
Tu ne peux donc pas lui attribuer le datasource.


Le Datasource a déjà été affecté, avant le DataField.
De toutes façons, connecté ou non, cela ne marche pas (cf mon dernier message).
Calade

Expose ton code, (je n'ai pas de base SQL)


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
Messages postés
1207
Date d'inscription
dimanche 20 avril 2003
Statut
Membre
Dernière intervention
4 juin 2016
10
  
   Set DataSource as New ADODB.Recordset                        
   Set p_oFiles = New BH_CScanDrives 'DLL Perso'	
   DataSource.Fields.Append "FILE_NAME", adVarChar, MAX_PATH
   DataField = "FILE_NAME"
   DataSource.Open   
   With p_TManager.TFOLDER
      Do While "C:\Mes Photos\Vacances*.JPG" 'C'est évidemment un exemple, les valeurs réelles étant contenues dans d'autres propriétés.
         DataSource.AddNew
         DataSource.Fields("FILE_NAME").Value = p_oFiles.FileName
         DataSource.Update
      Loop
   End With
      CFiles.Visible = True:                                        CFiles.SetFocus
      Set CFiles.DataSource DataSource:                           CFiles.DataField DataField

La routine fait appel à un composant perso' d'itération dans un dossier donné de manière à récupérer les fichiers répondant à certains critères (par Exemple: "C:\Mes Photos\Vacances*.JPG") (c'est la valeur de départ du Do While)
p_oFiles.FileName renvoie donc le nom du fichier SANS le dossier qui serait redondant.

Le projet est en fait un OCX d'affichage de vignettes et Datasource une propriété contenant un recordset (connecté ou non cela dépend d'autres propriétés).
DataField contient le nom du champ (forcé à FILE_NAME ici)
CFiles est le combobox posant problème.

Evidemment j'ai un peu élagué le code pour ne pas t'ensevelir sous des pages de code.

Calade