Bonjour,
J'ai défini dans ma webpart deux valeurs possibles d'une propriété qui permet de faire un double affichage d'items selon qu'ils appartiennent à l'utilisateur en cours ou pas (MyTasks et AllTasks).
J'ai également créé un ToolBarButton qui permet de passer d'un état à l'autre.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 string _affModeParDefaut; [Category("Configuration avancée"), WebDisplayName("Mode d'affichage"), Personalizable(PersonalizationScope.Shared), WebBrowsable(true)] public string ModeAffichageDefaut { get { if ((this._affModeParDefaut == null) || (this._affModeParDefaut.Equals(string.Empty))) { this._affModeParDefaut = "AllTasks"; } return this._affModeParDefaut; } set { if (value.Equals("MyTasks") || value.Equals("AllTasks")) { this._affModeParDefaut = value; } } } public string ModeAffichage { get { try { if ((this.ViewState["ModeAffichage"] != null) || !(this.ViewState["ModeAffichage"].ToString().Equals(string.Empty))) { return this.ViewState["ModeAffichage"].ToString(); } } catch (Exception e) { this.debugMessage = this.debugMessage + "<br> _ModeAffichageGet() : erreur " + e.Message; } this.ViewState["ModeAffichage"] = ModeAffichageDefaut; return this.ViewState["ModeAffichage"].ToString(); } set { if (value.Equals("MyTasks") || value.Equals("AllTasks")) { this.debugMessage = this.debugMessage + "<br> _affModeParDefaut affecté à " + value; this.ViewState["ModeAffichage"] = value; } } }
L'eventHandler lié au click est défini comme ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 protected override void CreateChildControls(){ //Création de base //Synchro des menus/titre avec le mode d'affichage //Création de la toolbar dont ceci : ToolBarButton boutonMesTaches = (ToolBarButton)this.Page.LoadControl("~/_controltemplates/ToolBarButton.ascx"); boutonMesTaches.ID = "idBoutonMesTaches"; string modeAffichage = this.ModeAffichage; switch (modeAffichage) { case "MyTasks" : boutonMesTaches.Text = "Toutes les tâches"; boutonMesTaches.ImageUrl = this._strImgFldr + "btn_MyTasks.gif"; boutonMesTaches.ToolTip = "Cliquer pour voir toutes les tâches."; break; case "AllTasks" : boutonMesTaches.Text = "Mes tâches seulement"; boutonMesTaches.ImageUrl = this._strImgFldr + "btn_AllTasks.gif"; boutonMesTaches.ToolTip = "Cliquer pour voir vos tâches."; break; //Default case = pareil que MyTasks } boutonMesTaches.Click += new EventHandler(boutonMesTaches_Click); ToolBar bar = (ToolBar)this.Page.LoadControl("~/_controltemplates/ToolBar.ascx"); bar.ID = "idToolBar"; bar.Buttons.Controls.Add(boutonMesTaches); this.Controls.Add(bar); //Création de la SPGridView }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 void boutonMesTaches_Click(object sender, EventArgs e) { switch (this.ModeAffichage) { case "MyTasks": this.ModeAffichage = "AllTasks"; break; case "AllTasks": this.ModeAffichage = "MyTasks"; break; default: this.ModeAffichage = "AllTasks"; break; } }
La méthode OnLoad est surchargée par défaut dans les modèles WSPBuilder :
Ce qui m'amène à mon problème :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 protected override void OnLoad(EventArgs e) { if (!_error) { try { base.OnLoad(e); this.EnsureChildControls(); } catch (Exception ex) { HandleException(ex); } } }
Je n'ai pas de grosse expérience sur ASP, mais il me semble que le Click() sur serveur est appelé après le onLoad(). Du coup lors de mon premier click, la webpart reste inchangée visuellement mais la valeur de la propriété ModeAffichage est modifiée (passage dans le handler du click). Lors d'un deuxième click on a l'effet visuel escompté (du précédent click) mais ça craint car on a une décorrélation avec la valeur de la propriété ModeAffichage.
J'ai également un effet de bord avec l'eventHandler de Sorting() que j'applique à ma SPGridView, tel que détaillé ici : http://stephaneey.developpez.com/tut...spgridview/#LV
En effet, le sorting effectue un postback qui change le ModeAffichage (probablement dû au problème sus-cité).
J'ai l'impression d'être passé à côté de quelque chose, mais je ne sais pas quoi. Pouvez-vous m'indiquer ce qui ne va pas dans mon code ou au pire des recommandations pour arriver à faire ce que je souhaite (sans devoir implémenter FilterDataFields dans la SPGridView).
Partager