Affichage conditionnel de champs dans un sous-formulaire

Le
oualaléreur
Bonjour,

j'ai un sous-formulaire qui affiche btement les champs prsents dans
une table en vue "datasheet".
Le problme vient de ce que d'une fois sur l'autre les champs
prsents 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 mmes text box prsents quand je
l'ouvre en vue "desing".

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

Sinon, l'idal, ce serait de crr ces contrles la demande, soit
en mme 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
aprs, mais l j'y ai pass dja 5 heures, et ca tourne pas mieux.

Merci

benoit
  • Partager ce contenu :
Vos réponses
Trier par : date / pertinence
3stone
Le #5971341
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/
oualaléreur
Le #5971241
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
3stone
Le #5970991
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/
oualaléreur
Le #5970481
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
3stone
Le #5970221
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/
oualaléreur
Le #5969281
Ok... J'aurais pas pensé à ca.

merci pour l'astuce !

à +
Benoit
oualaléreur
Le #5969271
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
3stone
Le #5969241
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/
Poster une réponse
Anonyme