C# : Mon code à tout le temps un train de retard...

C# : Mon code à tout le temps un train de retard... - C#/.NET managed - Programmation

Marsh Posté le 16-12-2005 à 23:04:57    

Code :
  1. using System;
  2. using System.Data;
  3. using System.Data.Common;
  4. using System.Data.SqlClient;
  5. using System.Configuration;
  6. using System.Collections;
  7. using System.Web;
  8. using System.Web.UI;
  9. using System.Web.UI.WebControls;
  10. using System.Web.UI.WebControls.WebParts;
  11. using System.Web.UI.HtmlControls;
  12. public partial class _Default : System.Web.UI.Page
  13. {
  14.     protected void Page_Load(object sender, EventArgs e)
  15.     {
  16.         SqlConnection cnx = new SqlConnection(ConfigurationManager.ConnectionStrings["LocalSqlServer"].ConnectionString);
  17.         cnx.Open();
  18.         SqlCommand cmd = new SqlCommand("select language, nb_total from mot_count", cnx);
  19.         cmd.Prepare();
  20.         SqlDataReader dr = cmd.ExecuteReader();
  21.         languageList.DataSource = dr;
  22.         languageList.DataBind();
  23.         cnx.Close();
  24.     }
  25.     protected void languageList_ItemDataBound(object sender, DataListItemEventArgs e)
  26.     {
  27.         DataListItem item = e.Item;
  28.         string language;
  29.         if (item.FindControl("languageLink" ) != null)
  30.         {
  31.             language = ((DbDataRecord)item.DataItem).GetString(0);
  32.             if ((string)Session["language"] == language)
  33.             {
  34.                 ((HtmlTableRow)item.FindControl("itemRow" )).Style.Add("background-color", "yellow" );
  35.             }
  36.             ((LinkButton)item.FindControl("languageLink" )).CommandArgument = language;
  37.         }
  38.     }
  39.     protected void setLanguage(object sender, CommandEventArgs e)
  40.     {
  41.         Session["language"] = (string)e.CommandArgument;
  42.     }
  43. }


 
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 :sweat:

Reply

Marsh Posté le 16-12-2005 à 23:04:57   

Reply

Marsh Posté le 16-12-2005 à 23:11:18    

Je viens de résoudre mon problème comme suis :
 

Code :
  1. protected void setLanguage(object sender, CommandEventArgs e)
  2.     {
  3.         Session["language"] = (string)e.CommandArgument;
  4.         Page_Load(null, null);
  5.     }


 
M'enfin si vous avez plus gore à me proposer je suis preneur, parceque là, franchement... :/

Reply

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

Reply

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"


Message édité par Arjuna le 17-12-2005 à 15:42:47
Reply

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.


---------------
-( BlackGoddess )-
Reply

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 :pt1cable:
 
Bon, reste à trouver une solution de contournement...

Reply

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.


---------------
Tout est normal, suffit de comprendre pourquoi.
Reply

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 :spamafote:

Reply

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

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 :)


---------------
Tout est normal, suffit de comprendre pourquoi.
Reply

Marsh Posté le 19-12-2005 à 13:56:34    

Très instructif (en anglais)
http://msdn.microsoft.com/library/ [...] ecycle.asp


---------------
Tout est normal, suffit de comprendre pourquoi.
Reply

Marsh Posté le 19-12-2005 à 13:56:34   

Reply

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 :jap:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed