C# : Mon code à tout le temps un train de retard... - C#/.NET managed - Programmation
Marsh Posté le 16-12-2005 à 23:11:18
Je viens de résoudre mon problème comme suis :
Code :
|
M'enfin si vous avez plus gore à me proposer je suis preneur, parceque là, franchement...
Marsh Posté le 17-12-2005 à 15:40:25
Pour info, ma bidouille ne résouds pas mon problème hein, elle ne fais que forcer le relancement de tout le code à chaque chargement, et moi c'est pas du tout ce que je veux
Donc je suis toujours preneur d'un petit coup de main, parceque ça me lourde un peu cette histoire...
Marsh Posté le 17-12-2005 à 15:42:01
J'oubliais : "setLanguage" est associé à l'évènement "onCommand" du linkButton "languageLink" présent dans chaque Item de mon dataSet "languageList"
Marsh Posté le 19-12-2005 à 09:37:36
euh
dans l'ordre :
- la page est renvoyée sur le serveur
- l'objet page est construit
- Page_Load est appelé
- databind
- languageList_ItemDataBound est appelé
- setLanguage est appelé
Le PageLoad est appelé avant les évènements qu'a pu déclencher l'utilisateur.
Donc lorsque ta valeur Session["language"] change, le bind est déjà fait.
Marsh Posté le 19-12-2005 à 11:15:04
c'est balo...
C'est d'ailleurs un peu con que Page_Load se lance avant l'évènement... Puisque c'est lui qui a fait recharger la page
Bon, reste à trouver une solution de contournement...
Marsh Posté le 19-12-2005 à 11:55:13
Nan c'est pas con.
Si l'évènement se lance AVANT le Page_Load, tu peux rien faire vu que t'as aucun objets : ils ont pas encore été chargés.
Bref c'est normal et incontournable en Web. J'ai eu le même pb 'philosophique' quand j'ai commencé le We (c'est pour ça que je le hais, même si j'ai fait que ça en entreprise)
Idée de solution de contournement (assez tordu et pas très beau) :
- Tu colles un champ caché dans ta page.
- Tu rajoute un bout de Javascript pour changer la valeur dans le champ caché (côté client) quand la valeur change dans ta languageList.
- Au page_load, tu lis le champ caché pour savoir le langage choisi.
Marsh Posté le 19-12-2005 à 12:37:08
Il suffit plutôt de faire un Response.Redirect("Default.aspx?language=FR" ); dans mon évènement, et lire ensuite la valeur du code.
Ou même faire charger une autre page "change_language.aspx" qui met en session et renvoie ensuite sur Default.aspx, mais je trouve ça un peu à chier.
Sinon, les objets n'existent pas encore après un click, oui et non. Avec le viewstate, les objets du chargement précédent sont censés être encore là.
A ce niveau, l'ASP ou le PHP (où on fait tout à la main), je trouve ça mieu foutu. On exécute vraiment le code comme on veut, dans l'ordre qu'on veut
Marsh Posté le 19-12-2005 à 13:54:51
Arjuna a écrit : Il suffit plutôt de faire un Response.Redirect("Default.aspx?language=FR" ); dans mon évènement, et lire ensuite la valeur du code. |
Response.Redirect : ouais mais du coup ta page se charge deux fois. Le jour où t'as un gros volume de données, ça ve se sentir.
En fait, c'est pas un question de ViewState où quoi. Le pb ici il est philosophique : en Web tout est détruit à chaque requête, donc la première chose qui est faite, c'est de recréer tout et de faire un page_load. Après on commence à réfléchir. C'est très très relou pour faire de l'évènementiel.
Sinon y'a quand même un mécanisme qui est prévu pour ça : le booléen IsPostBack dans Page.
Ce que tu peux essayer :
1 - Le code de chargement de ta liste, tu le colles dans une méthode RemplirListe à part.
2 - Dans ton page load, si IsPostBack est à faux, alors tu appelles RemplirListe. Sinon tu fais rien.
3 - Dans ton évènement, à la fin tu appelles RemplirListe.
Le seul soucis, c'est si y'a d'autres controles dans ta page... faudra appeler RemplirListe dans le code de tous les évènements
Marsh Posté le 19-12-2005 à 13:56:34
Très instructif (en anglais)
http://msdn.microsoft.com/library/ [...] ecycle.asp
Marsh Posté le 19-12-2005 à 16:29:43
Déjà, dans un premier temps, je vais mettre la liste dans un contrôle utilisateur. J'ai remarqué que faire ça évite un certain nombre de soucis de ce genre, et ça tombe bien, c'est en effet un élément qui doit être accessible depuis toutes les pages du site.
Le fonctionnement : au changement de langue, modifier la session et renvoyer sur la page d'acceuil. Le coup du Redirect devrait donc aller.
Sinon, pour le coup du RemplirList, j'y ai aussi pensé, mais pas compris pourquoi, si je le fait avec isPostBack, la page se vide au rechargement (les objets sont détruits et le ViewState, qui doit conserver les objets tels qu'ils étaient avant le rechargement ne marche pas).
Le problème vient certainement du fait que je suis avec le FrameWork 2.0 et VS 2005 Express : il ne marche plus comme VS 2003 et le Framework 2003. Par exemple, pour les évènements : avant, les handleurs étaient écrits dans le C#. Maintenant, ils ne sont que dans le HTML, et je me demande si mon problème ne vient pas de là. A creuser.
Merci pour toutes ces infos, ça devrait me donner matière pour tester et avancer
Marsh Posté le 16-12-2005 à 23:04:57
Si je clique sur "FR", alors il ne se passe rien.
Si je clique alors sur "EN", alors "FR" devient jaune.
Si je re-clique sur "EN", alors il devient jaune.
Si je re-clique sur "FR" alors "EN" reste jaune.
Si je vais dans l'url et que je valide (je recharge sans rien reposter) alors "FR" devient jaune.
En bref, mon code marche bien, mais avec un chargement de page de retard
Comment ça se fait ? C'est pourtant tout con ce que je lui demande