Affichage conditionnel de champs dans un sous-formulaire
8 réponses
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.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
"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
"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
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
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.
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
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.
"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.
"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.
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
Salut,
Avec ca, effectivement, les champs sont vide et n'ont plus de noms.
C'est suffisant.
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 ?
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
Salut,
"oualaléreur" Avec ca, effectivement, les champs sont vide et n'ont plus de noms. C'est suffisant.
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
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
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
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)
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)
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)