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.
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
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
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.
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.
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.