Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1636 connectés 

  FORUM HardWare.fr
  Programmation
  C#/.NET managed

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

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1268793
Arjuna
Aircraft Ident.: F-MBSD
Posté le 16-12-2005 à 23:04:57  profilanswer
 

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:

mood
Publicité
Posté le 16-12-2005 à 23:04:57  profilanswer
 

n°1268796
Arjuna
Aircraft Ident.: F-MBSD
Posté le 16-12-2005 à 23:11:18  profilanswer
 

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

n°1268956
Arjuna
Aircraft Ident.: F-MBSD
Posté le 17-12-2005 à 15:40:25  profilanswer
 

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

n°1268957
Arjuna
Aircraft Ident.: F-MBSD
Posté le 17-12-2005 à 15:42:01  profilanswer
 

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
n°1269720
blackgodde​ss
vive le troll !
Posté le 19-12-2005 à 09:37:36  profilanswer
 

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 )-
n°1269786
Arjuna
Aircraft Ident.: F-MBSD
Posté le 19-12-2005 à 11:15:04  profilanswer
 

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

n°1269819
_Mose_
Lonesome coder
Posté le 19-12-2005 à 11:55:13  profilanswer
 

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.
n°1269851
Arjuna
Aircraft Ident.: F-MBSD
Posté le 19-12-2005 à 12:37:08  profilanswer
 

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:

n°1269896
_Mose_
Lonesome coder
Posté le 19-12-2005 à 13:54:51  profilanswer
 

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.
n°1269898
_Mose_
Lonesome coder
Posté le 19-12-2005 à 13:56:34  profilanswer
 

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


---------------
Tout est normal, suffit de comprendre pourquoi.
mood
Publicité
Posté le 19-12-2005 à 13:56:34  profilanswer
 

n°1270062
Arjuna
Aircraft Ident.: F-MBSD
Posté le 19-12-2005 à 16:29:43  profilanswer
 

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:


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C#/.NET managed

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

 

Sujets relatifs
Balise BBCode pour du code source[ HTML / JS ] innerHTML et beaucoup de code à mettre dedans
Tracer des graphs en temps réelCode C question !
Besoin d'un soft pour autoconvertir du texte en code HTML !Les informations de mes serveurs jeu sur mon site en temps reel
[résolu] Comment faire une boucle de ce code au lieu de l'ecrir[VHDL] entrée et sortie en meme temps
Allocation en deux temps d'un vector<vector<float>>Comment vérouiller une cellule par un code?
Plus de sujets relatifs à : C# : Mon code à tout le temps un train de retard...


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR