IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SharePoint .NET Discussion :

Evénement ToolBarButton.click et changement d'état de webpart


Sujet :

SharePoint .NET

  1. #1
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 486
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 486
    Points : 2 082
    Points
    2 082
    Par défaut Evénement ToolBarButton.click et changement d'état de webpart
    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).

    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;
                    }
                }
            }
    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
     
    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
         }
    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
            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 :
    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);
                    }
                }
            }
    Ce qui m'amène à mon problème :
    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).

  2. #2
    Expert confirmé Avatar de Lapinpanda
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2009
    Messages
    3 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2009
    Messages : 3 230
    Points : 4 913
    Points
    4 913
    Par défaut
    Je sais pas si c'est une bonne méthode, mais moi j'utilise des redirections pour rafraichir la page est affiché le bon contenu.

    Et au load, en fonction des paramètres qu'ils reçoit, j'affiche tel ou tel chose.

    Ce genre de chose serait t'aider?
    Merci d'utiliser en cas de résolution de votre problème

    N'oubliez pas non plus le petit pouce vert pour récompenser celui que vous a aidé

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 486
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 486
    Points : 2 082
    Points
    2 082
    Par défaut
    J'y avais pensé, c'est vrai qu'en prenant des paramètres de cette façon on est sûr d'être clean niveau enchaînement des events ASP.

    Je garde cette solution sous le coude pour respecter les délais de livraison juste au cas où, mais le tekos qui est en moi a envie de faire ça bien. En plus j'imagine que la solution ne tient qu'à un pauvre booléen...

Discussions similaires

  1. [BOOTSTRAP] Evènement au changement d'état de buttons-checkbox
    Par narmataru dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 11/03/2013, 17h23
  2. Changement d'état au click sur un bouton
    Par aiss57 dans le forum Flex
    Réponses: 3
    Dernier message: 20/05/2009, 15h52
  3. [VBA-E] changement d'état d'un formulaire
    Par ooyeah dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 19/03/2007, 09h54
  4. Réponses: 4
    Dernier message: 08/01/2007, 14h48
  5. Pourcentage de changement d'état
    Par Krispy dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 03/04/2006, 16h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo