Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Affichage conditionnel de champs dans un sous-formulaire

8 réponses
Avatar
oualaléreur
Bonjour,

j'ai un sous-formulaire qui affiche b=EAtement les champs pr=E9sents dans
une table en vue "datasheet".
Le probl=E8me vient de ce que d'une fois sur l'autre les champs
pr=E9sents dans la table varient : ils y en a qui disparaissent, et
d'autres qui apparaissent. et nom affichage, lui, n'est pas dynamique.
C'est =E0 dire que j'ai toujours les m=EAmes text box pr=E9sents quand je
l'ouvre en vue "desing".

Le plus simple, c'est peut-=EAtre de rendre ces contr=F4les invisibles
lorsque les champs correspondants sont
absents, mais je ne sais ni comment ni o=F9 mettre le code.

Sinon, l'id=E9al, ce serait de cr=E9r ces contr=F4les =E0 la demande, soit
en m=EAme temps que les champs de la table (mais je crois que ce n'est
pas possible, ce code se situant dans un autre formulaire), soit
apr=E8s, mais l=E0 j'y ai pass=E9 d=E9ja 5 heures, et ca tourne pas mieux.

Merci

benoit

8 réponses

Avatar
3stone
Salut,

"oualaléreur"
j'ai un sous-formulaire qui affiche bêtement les champs présents dans
une table en vue "datasheet".
Le problème vient de ce que d'une fois sur l'autre les champs
présents dans la table varient : ils y en a qui disparaissent, et
d'autres qui apparaissent. et nom affichage, lui, n'est pas dynamique.
C'est à dire que j'ai toujours les mêmes text box présents quand je
l'ouvre en vue "desing".

Le plus simple, c'est peut-être de rendre ces contrôles invisibles
lorsque les champs correspondants sont
absents, mais je ne sais ni comment ni où mettre le code.




Regarde cette conversation :
http://minilien.com/?M5TLVsv8JD


--
A+
Pierre (3stone) Access MVP
Perso: http://www.3stone.be/
Conseils MPFA: http://www.mpfa.info/
Avatar
oualaléreur
Salut,

Suivant tes conseils, j'ai placé ce code dans l'événement Activate
de mon sous-formulaire...

Dim intIndex As interger
Dim rst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("Temp_Tbl_AdHock", dbOpenDynaset)


With rst
For intIndex = 0 To .Fields.Count - 1
Me.Controls("t" & intIndex).ControlSource =
.Fields(intIndex).Name
Next
For intIndex = .Fields.Count - 1 To 10
Me.Controls("t" & intIndex).Visible = False
Next
End With

...Et il a exactement le même comportement.
Donc soit ce n'est pas l'événement approprié, soit ca n'est pas ce
que je cherche.
Pour l'événement, c'est facile de vérifier : en mode datasheet, ce
qui s'affiche en haut des colonnes, c'est le nom ou la source du
contrôle ?

En fait, ce que je souhaiterais faire, c'est plutôt de créer des
contrôles en fonction des champs de la table. Comme le sous-formulaire
est lié à cette table, les contrôles se créent automatiquement la
première fois et puis c'est tout. Du coup, je me retrouve soit avec
des champs que je ne peux voir, soit avec des champs remplis de
"#NAME?".
Pour rappel, cette table est crée juste avant et remplie avec des
données issues d'un fichier texte, et le nombre et les noms des champs
changent d'une fois sur l'autre. bref, la table est crée
dynamiquement, mais si ce n'est pas aussi le cas du sous-formulaire qui
permet de la visualiser, il n'y a plus d'intérêt.

Peut-être suffirait-il de tous les effacer à la fermeture ?
je me demande aussi quel est l'ordre des events dans la vie d'un
formulaire.

Merci,

benoit
Avatar
3stone
Salut,

"oualaléreur"
Suivant tes conseils, j'ai placé ce code dans l'événement Activate
de mon sous-formulaire...



sur ouverture serait plus indiqué...





Dim intIndex As interger
Dim rst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("Temp_Tbl_AdHock", dbOpenDynaset)


With rst
For intIndex = 0 To .Fields.Count - 1
Me.Controls("t" & intIndex).ControlSource .Fields(intIndex).Name
Next
For intIndex = .Fields.Count - 1 To 10
Me.Controls("t" & intIndex).Visible = False
Next
End With

...Et il a exactement le même comportement.
Donc soit ce n'est pas l'événement approprié, soit ca n'est pas ce
que je cherche.
Pour l'événement, c'est facile de vérifier : en mode datasheet, ce
qui s'affiche en haut des colonnes, c'est le nom ou la source du
contrôle ?

En fait, ce que je souhaiterais faire, c'est plutôt de créer des
contrôles en fonction des champs de la table. Comme le sous-formulaire
est lié à cette table, les contrôles se créent automatiquement la
première fois et puis c'est tout. Du coup, je me retrouve soit avec
des champs que je ne peux voir, soit avec des champs remplis de
"#NAME?".
Pour rappel, cette table est crée juste avant et remplie avec des
données issues d'un fichier texte, et le nombre et les noms des champs
changent d'une fois sur l'autre. bref, la table est crée
dynamiquement, mais si ce n'est pas aussi le cas du sous-formulaire qui
permet de la visualiser, il n'y a plus d'intérêt.



et rien ne t'empêche de boucler sur le reste des textbox...
Si tu en as par exemple 20, tu ajoute une boucle de

for intIndex = intIndex to 20
Me.Controls("t" & intIndex).ControlSource = null
next intIndex

ou même de les rendrent invisible...

Pense aussi, lors de la fermeture du formulaire de ne pas sauver les modifications!
Cela évitera qu'à la prochaine ouverture, elle cherche les "sources" des textbox.

DoCmd.Close acForm, Me.Name, acSaveNo


--
A+
Pierre (3stone) Access MVP
Perso: http://www.3stone.be/
Conseils MPFA: http://www.mpfa.info/
Avatar
oualaléreur
Salut,

Avec ca, effectivement, les champs sont vide et n'ont plus de noms.
C'est suffisant.

For intIndex = .Fields.Count To 20

Me.Controls("t" & intIndex).ControlSource = ""
Me.Controls("l" & intIndex).Caption = ""

Me.Controls("t" & intIndex).Visible = False
Me.Controls("l" & intIndex).Visible = False

Next

Mais c'est quand même étrange, qu'ils ne soient jamais invisibles.
Les deux dernières lignes n'ont aucun effet sur l'affichage.
j'ai utilisé l'évènement sur ouverture comme tu m'a dis. Par
curiosité, sais-tu qu'est-ce qui pourrait empêcher de rendre ces
contrôles invisibles ?

Merci pour tes conseils,
à+
Benoit
Avatar
3stone
Salut,

"oualaléreur"
Avec ca, effectivement, les champs sont vide et n'ont plus de noms.
C'est suffisant.

For intIndex = .Fields.Count To 20

Me.Controls("t" & intIndex).ControlSource = ""
Me.Controls("l" & intIndex).Caption = ""

Me.Controls("t" & intIndex).Visible = False
Me.Controls("l" & intIndex).Visible = False

Next

Mais c'est quand même étrange, qu'ils ne soient jamais invisibles.
Les deux dernières lignes n'ont aucun effet sur l'affichage.
---------------------------------------------------------------


En fait, le textbox sont bien caché... ce que tu vois, ce sont les "colonnes des données"
Il faut pour cela jour sur la largeur de colonne.

Me.Controls("T" & intIndex).ColumnWidth = 0


et, dans la partie affectation du controlsource, éventuellement compléter par :

For intIndex = 0 To .Fields.Count - 1
Me.Controls("t" & intIndex).ControlSource = .Fields(intIndex).Name
Me.Controls("t" & intIndex).ColumnWidth = -2 'ajuster
Next



--
A+
Pierre (3stone) Access MVP
Perso: http://www.3stone.be/
Conseils MPFA: http://www.mpfa.info/
Avatar
oualaléreur
Ok... J'aurais pas pensé à ca.

merci pour l'astuce !

à +
Benoit
Avatar
oualaléreur
Ca y est ca fonctionne. Voici le code qui effectue les opérations
désirées.
J'ai pas essayé sans ColumnWidth, mais ColumnHidden est nécessaire
aparemment.

Merci encore et à +

Benoit



Private Sub Form_Open(Cancel As Integer)

Dim intIndex As Integer
Dim rst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("Temp_Tbl_AdHock", dbOpenDynaset)


With rst
For intIndex = 0 To .Fields.Count - 1

Me.Controls("t" & intIndex).ControlSource =
.Fields(intIndex).Name
Me.Controls("t" & intIndex).ColumnWidth = -2
Me.Controls("t" & intIndex).ColumnHidden = 0
Me.Controls("l" & intIndex).Caption = .Fields(intIndex).Name

Next

For intIndex = .Fields.Count To 20

Me.Controls("t" & intIndex).ControlSource = ""
Me.Controls("t" & intIndex).ColumnWidth = 0
Me.Controls("t" & intIndex).ColumnHidden = -1
Me.Controls("l" & intIndex).Caption = ""

Next


End With

End Sub
Avatar
3stone
Salut,

"oualaléreur"
...mais ColumnHidden est nécessaire aparemment.


Fonctionne parfaitement _sans_ chez moi...


et pour faire plus propre :

For intIndex = .Fields.Count To 20

With Me.Controls("t" & intIndex)
.ControlSource = ""
.ColumnWidth = 0
.ColumnHidden = True
.Caption = ""
End With

Next


--
A+
Pierre (3stone) Access MVP
Perso: http://www.3stone.be/
Conseils MPFA: http://www.mpfa.info/