[Resolu] C#, User Control et Include

Voila, j’ai debute asp et c# il y a quelques mois (autodidacte sur ces technos) et je pense que j’ai du louper quelque chose, donc je vous expose le probleme et vous me dites ce qui a pas et eventuellement la facon de bien faire :stuck_out_tongue:

Je dois faire plein de pages asp avec des control de partout (normal :stuck_out_tongue: ).
j’ai donc decoupe mes pages asp en 3 parties:

  • un menu en haut (quasi statique pour l’instant)
  • un menu a gauche (avec des control qui changent des variables de sessions, etc)
  • un contenu de page avec des control qui recuperent les variables de session, etc)

pour cela j’ai utilise des includes pour eviter de duppliquer du code:

J’ai cree dans ce fichier _leftMenu.aspx, un user control « leftMenu.ascx » :
<%@ Register TagPrefix=« aspPegase » TagName=« LeftMenu » Src=« leftMenu.ascx » %>
<aspPegase:LeftMenu id=« LeftMenuPegase » runat=« server » />

ou leftMenu.ascx contiens des control qui changent des variables de session qui sont censees etre recuperees dans ma page principale lors de son affichage.

Mais mon soucis c’est que quand je change une valeur d’un de mes controls de ce user control, je n’arrive pas a recuperer les variables de sessions modifiees dans ma page principale.
Apparemment j’ai « un coup de retard » puisqu’apres un refresh, ca s’affiche correctement.

C’est quoi que j’ai mal fait ?

Y’a t’il une facon propre de faire ce que je voudrai faire ?
Merci de votre aide :stuck_out_tongue:

Une petite remarque :
Pourquoi faire un include d’une page aspx quand il te suffit de placer le usercontrol sur ta page principale?

Je pense qu’en faisant cela ca devrait mieux marcher :
L’ordre d’éxécution des pages quand tu fais l’include, c’est d’abord les actions sur la page principale puis celles venant des pages includées. Du coup les actions que tu entreprends sur ton leftmenu sont traitées après la mise à jour du contenu de la page principal. d’ou le décalage.

Voilà voilà, c’est comme ca que j’interprète ton problème.

Les UserControl permettent justement de ne pas avoir à faire d’inclusion (tu sépare le code de ton interface en plusieurs controles, mais ils s’affichent tous dans la même page aspx).

[quote name=‹ Dji › date=’ 7 Jun 2005, 11:09’]Y’a t’il une facon propre de faire ce que je voudrai faire ?
Merci de votre aide :stuck_out_tongue:
[right][post=« 366053 »]<{POST_SNAPBACK}>[/post][/right][/quote]
Passer en .net 2 :P"

Non, en fait c’est le concept de SSI (le ) qu’il te faut complètement oublier. Je pense aussi que le problème d’ordre des traitements peut venir de là.

Essaie simplement de supprimer le #include. Plutôt que de faire un #include de _leftMenu.aspx, mets directement ton aspPegase:LeftMenu dans ta page contenu.

Ou si tu tiens absolument à alléger ta page contenu, fait un premier usercontrol « BeforeContent » par exemple, qui contiendra lui-même lefMenu & ton control header. Comme ça tu n’utilise que ton controle BeforeContent dans tes pages de contenu.

Voilà par exemple ce à quoi cela pourrait ressembler :
<%@ Register TagPrefix=« aspPegase » TagName=« BeforeContent » Src=« beforeContent.ascx » %>
<%@ Register TagPrefix=« aspPegase » TagName=« AfterContent » Src=« afterContent.ascx » %>
<aspPegase:BeforeContent id=« beforeContent » runat=« server » />
mon contenu…
<aspPegase:AfterContent id=« afterContent » runat=« server » />

Ensuite, si tu as des problèmes d’ordre des traitements, quelques points d’arret devraient t’aider à piger dans quel ordre tes méthodes sont exécutées.

je viens de faire le changement et j’ai le meme resultat malheureusement.

le page_load de la page qui s’affiche est appelle avant le page_load du user control qu’elle contiens meme si celui-ci n’est pas dans un #include.

[quote name=‘Dji’ date=’ 7 Jun 2005, 13:17’]le page_load de la page qui s’affiche est appelle avant le page_load du user control qu’elle contiens meme si celui-ci n’est pas dans un #include.
[right][post=“366099”]<{POST_SNAPBACK}>[/post][/right][/quote]
Et dans ce cas la solution peut consister à utiliser le Page_Init dans tes usercontrols, par exemple.

Le mieux est de se faire un petit schéma de l’ordre de levée des evènement, et de mater un peu la doc msdn pour voir ce que signifie réellement chaque évènement et lequel utiliser dans quel cas.

Edit : à priori tu devrais trouver pas mal d’aide sur cette page : http://msdn.microsoft.com/library/default…onlifecycle.asp

bin non, mes user control s’affichent tres bien, c’est la page principale qui s’affiche pas avec les changements qui sont effectues dans le user control.

Je pige plus trop là. Ton problème, c’est bien que tu modifies des variables session dans ton Page_Load de tes uc, et que tu voudrais récupérer ces variables modifier dans ton Page_Load de ta page, c’est bien ça ?

Si c’est bien de cela qu’il s’agit, pourquoi ne modifies-tu pas tes variables session dans l’évènement Page_Init dans tes usercontrols ? Ainsi, tu serais sur que le code de tes usercontrols serait exécuté avant ton Page_Load, non ?

c’est ca, t’a pas compris, ou j’ai mal explique c’est selon :stuck_out_tongue:

je mets a jour des variables de session dans les fonctions « selectedindexchanged » (par exemple) des controls de mon user control.

Mais je veux pouvoir juste apres les re-utiliser dans le page_load de ma page principale.

le probleme est que ca ne marche pas comme ca car le page_load est la page principale est appelle AVANT le selectedindexchanged de mon user control.

Donc j’ai change un peu mon code, ca me fais faire un peu plus de boulot mais bon , ca marchouille comme ca peux :P" mais c’est pas propre :stuck_out_tongue:

[quote name=‹ Dji › date=’ 7 Jun 2005, 15:30’]c’est ca, t’a pas compris, ou j’ai mal explique c’est selon :stuck_out_tongue:

je mets a jour des variables de session dans les fonctions « selectedindexchanged » (par exemple) des controls de mon user control.

Mais je veux pouvoir juste apres  les re-utiliser dans le page_load de ma page principale.

le probleme est que ca ne marche pas comme ca car le page_load est la page principale est appelle AVANT le selectedindexchanged de mon user control.

Donc j’ai change un peu mon code, ca me fais faire un peu plus de boulot mais bon , ca marchouille comme ca peux :P"  mais c’est pas propre :stuck_out_tongue:
[right][post=« 366144 »]<{POST_SNAPBACK}>[/post][/right][/quote]

une solution est de déclarer des evenements sur ton usercontrol et de les handler dans ta classe de page aspx. Il faut aussi savoir que de tte facon, le page_load s’éxécute avant les évènements des control de ta webform.

[quote name=‘girafologue’ date=’ 7 Jun 2005, 16:37’]Il faut aussi savoir que de tte facon, le page_load s’éxécute avant les évènements des control de ta webform.
[right][post=“366149”]<{POST_SNAPBACK}>[/post][/right][/quote]
Exactement, les évènements des contrôles résultant du postback sont bien levés après le onload, comme indiqué sur la doc msdn.

A toi d’organiser tes traitements, mais il faut les coder en pensant à cet ordre. Tu peux te calquer que les Render & PreRender qui s’effectuent bien apres les évènements liés au PostBack, et qui correspondront peut-être à ce que tu cherches à faire. Le Load correspond au statut initial de ta page, avec les variables correctement initialisées, mais aucun traitement lié aux évènements encore effectué.

Je pense donc qu’il te suffit de déplacer tes traitements devant s’effectuer apres les évènements dans le Page_PreRender.

[quote name=‘Styx31’ date=’ 7 Jun 2005, 15:48’]Exactement, les évènements des contrôles résultant du postback sont bien levés après le onload, comme indiqué sur la doc msdn.

A toi d’organiser tes traitements, mais il faut les coder en pensant à cet ordre. Tu peux te calquer que les Render & PreRender qui s’effectuent bien apres les évènements liés au PostBack, et qui correspondront peut-être à ce que tu cherches à faire. Le Load correspond au statut initial de ta page, avec les variables correctement initialisées, mais aucun traitement lié aux évènements encore effectué.

Je pense donc qu’il te suffit de déplacer tes traitements devant s’effectuer apres les évènements dans le Page_PreRender.
[right][post=“366153”]<{POST_SNAPBACK}>[/post][/right][/quote]

mouais, le coup du prerender je trouve ca pas terrible, il me semble etre plus “objet” de définir des évènement dans le usercontrol et de leur assigner des eventhandlers dans la webform… Selon ce qu’il fait, il pourra peut-etre même se passer de certaines variables de sessions (si elles ne sont là que pour communiquer des infos entre usercontrol et webpage par exemple)

Ouaip, mais une page qui veut se baser sur des variables session, sans forcément connaître tous les traitements des user controls qui sont suceptibles de les modifier n’a d’autre choix que de se placer après leur traitements, c’est à dire au prerender.

Ca doit vouloir dire qu’il s’agit bien de l’endroit où se brancher si l’on veut être sur d’avoir les infos à jour avant d’altérer le rendu, non ?

Ok, apparemment, je dois potasser la maniere de creer un evenement sur mon user control :stuck_out_tongue:

piouf, c’est relou de debuter un langage :stuck_out_tongue:

je vais potasser ca et je vais essayer de trouver comment declarer un evenement dans un user control et comment le gerer dans la classe de la page principale meme si il n’y a pas de variables definissant le user control :stuck_out_tongue:

[quote name=‹ Dji › date=’ 7 Jun 2005, 17:08’]et comment le gerer dans la classe de la page principale meme si il n’y a pas de variables definissant le user control :stuck_out_tongue:
[right][post=« 366163 »]<{POST_SNAPBACK}>[/post][/right][/quote]
Sisi, tu dois avoir une variable qui existe dans le Codebehind et qui représente ton usercontrol.

[quote name=‹ Styx31 › date=’ 7 Jun 2005, 16:11’]Sisi, tu dois avoir une variable qui existe dans le Codebehind et qui représente ton usercontrol.
[right][post=« 366165 »]<{POST_SNAPBACK}>[/post][/right][/quote]

Alors VS.NET me l’a jamais mise :stuck_out_tongue:

[quote name=‹ Dji › date=’ 7 Jun 2005, 17:24’]Alors VS.NET me l’a jamais mise :stuck_out_tongue:
[right][post=« 366168 »]<{POST_SNAPBACK}>[/post][/right][/quote]
Fouette le alors, il aime bien ça…

Plus sérieusement, sauf si tu n’utilises pas de codebehind, normalement un champ privé doit exister pour représenter ton uc. Tu l’as ajouté par le code html ? Dans ce cas, tu dois passer en mode design pour que le designer te l’ajoute dans ton source. Good luck :stuck_out_tongue:

ouais je sais, je connais le truc mais ca n’est pas ca.

Je verrai ca demain, ce soir il est trop tard :stuck_out_tongue:

Bon, j’ai lu l’article suivant:
http://www.codeproject.com/aspnet/aspnetusercontrol3.asp

Que j’ai mis en application mais au moment de lever mon evenement, j’ai une erreur null pointer exception:

Apparemment l’evenement n’est pas “connu” (d’ou le null)
pourtant dans mon user control (LeftMenu) y’a le code suivant:

[code]public event LeftMenuChangeEventHandler LeftMenuChange;

protected void OnLeftMenuChange(LeftMenuChangeEventArgs e)
{
 if (e != null)
   LeftMenuChange(this, e);
}[/code]

Et dans ma page ASP, j’ai mis:

[code]<%@ Reference Control=“leftMenu.ascx” %>

 
[/code]

Et dans le code behind de la page ASP, j’ai:

private void Page_Load(object sender, System.EventArgs e) { &nbsp;Control leftMenu = null; &nbsp;try &nbsp;{ &nbsp; &nbsp;leftMenu = LoadControl("leftMenu.ascx"); &nbsp; &nbsp;if (leftMenu != null) &nbsp; &nbsp;{ &nbsp; &nbsp; &nbsp;((LeftMenu) leftMenu).LeftMenuChange += new LeftMenuChangeEventHandler(this.LeftMenuChangeUpdateForm); &nbsp; &nbsp;} &nbsp;} &nbsp;catch (Exception ex) &nbsp;{ &nbsp; &nbsp;Message.Show(ex.Message); &nbsp;}

J’ai trace et le code de la page ASP est execute avant celui du lancement de l’venement, je ne comprends donc pas pourquoi quand je lance l’evenement j’ai cette erreur:

[quote]Object reference not set to an instance of an object.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.
Source Error:
Line 25:  {
Line 26:    if (e != null)
Line 27:    LeftMenuChange(this, e);
Line 28:  }
Source File: d:\intranet\pegase\leftmenu.ascx.cs    Line: 27
Stack Trace:
[NullReferenceException: Object reference not set to an instance of an object.]
  pegase.LeftMenu.OnLeftMenuChange(LeftMenuChangeEventArgs e) in d:\intranet\pegase\leftmenu.ascx.cs:27
  pegase.LeftMenu.DropDownListDepartment_SelectedIndexChanged(Object sender, EventArgs e) in d:\intranet\pegase\leftmenu.ascx.cs:275
  System.Web.UI.WebControls.ListControl.OnSelectedIndexChanged(EventArgs e)
  System.Web.UI.WebControls.DropDownList.System.Web.UI.IPostBackDataHandler.RaiseP

ostDataChangedEvent()
  System.Web.UI.Page.RaiseChangedEvents()
  System.Web.UI.Page.ProcessRequestMain()[/quote]

J’ai oublie un truc ou quoi ? Une idee ?

CA Y EST !!!

Mais Put$^**ù de Bor@+& de Mer^è# que ca a ete chiant ! :stuck_out_tongue:

Bon , j’ai resolu mes soucis:
1: ne jamais faire confiance a du code comme celui-la:

on crois que ce code est du commentaire, que nenni, ce serait trop logique :stuck_out_tongue:

2: j’ai gere l’ajout du controle dans ma page asp dans le code behind plutot que dans le code asp, et grace a ca, l’evenement LeftMenuChange ne vaut plus null quand je le lance :stuck_out_tongue:

3: j’ai bien droit a ma pause cafe maintenant !!!