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

Silverlight Discussion :

Navigation, passage de paramètres


Sujet :

Silverlight

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 109
    Par défaut Navigation, passage de paramètres
    Bonjour,

    Alors dans l'ordre... dans un but d'apprentissage j'ai foncé tête baissée :

    J'ai créé une Silverlight Business Application, avec la navigation intégrée donc, utilisé les .Net RIA Services, personalisé une requête Link pour obtenir les données bien comme il faut, et généré une liste de boutons, le tout depuis une base Firebird (j'en suis assez fier ^^ )

    morceau de code :
    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
     
    <StackPanel x:Name="LinksStackPanel">
     
       <riaControls:DomainDataSource x:Name="source"
           QueryName="GetCATEGORIEByNv" 
          AutoLoad="True">
     
          <riaControls:DomainDataSource.DomainContext>
             <domain:DUCContext />
          </riaControls:DomainDataSource.DomainContext>
     
          <riaControls:DomainDataSource.QueryParameters>
              <riaData:Parameter x:Name="CatQueryParameter"
                                         ParameterName="niveau"
                                         Value="0" />
          </riaControls:DomainDataSource.QueryParameters>
     
       </riaControls:DomainDataSource>
     
       <ItemsControl x:Name="ICtoBind" 
                           ItemsSource="{Binding Data,ElementName=source}">
     
          <ItemsControl.ItemsPanel>
             <ItemsPanelTemplate>
                <primitives:UniformGrid x:Name="UfGrid" 
                                               Columns="{Binding Path=source.Count}"
                                               Rows="1" Height="30" IsItemsHost="True" />
             </ItemsPanelTemplate>
          </ItemsControl.ItemsPanel>
     
          <ItemsControl.ItemTemplate>
             <DataTemplate>
                <HyperlinkButton Content="{Binding NOM}"
                                       NavigateUri="{Binding CIBLE}"
                                       Style="{StaticResource GlassHLButtonStyle}"
                                       />
             </DataTemplate>
          </ItemsControl.ItemTemplate>
     
       </ItemsControl>
     
    </StackPanel>
    et dans ma navigation Frame j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <uriMapper:UriMapping
          Uri="/{pageName}/{paramValue}"
          MappedUri="/Views/{pageName}.xaml?id={paramValue}"
          />
    ma liste d'hyperlink buttons s'affiche correctement et mes pages sont bien liées. Mon problème et que dans la page "enfant", ou Nested si vous préférez, j'aimerais récupérer le paramètre id={paramValue} de mon uri et le binder sur une propriété de cette page ainsi :

    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
    <riaControls:DomainDataSource 
          x:Name="sourcesc"
          QueryName="GetSSCATEGORIEByNv" 
          AutoLoad="True">
    
       <riaControls:DomainDataSource.DomainContext>
          <domain:DUCContext />
       </riaControls:DomainDataSource.DomainContext>
    
       <riaControls:DomainDataSource.QueryParameters>
          <riaData:Parameter x:Name="CatQueryParameter"
                                     ParameterName="cat"
                                     Value="{Binding id}"
                                     />
          <riaData:Parameter x:Name="SsCatQueryParameter" ParameterName="niveau" Value="0" />
       </riaControls:DomainDataSource.QueryParameters>
    
    </riaControls:DomainDataSource>
    à force de lectures et de recherches, je m'épuise... sans trouver mon bonheur.

    dans le page_loaded de ma page enfant, j'arrive à le récupérer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public string id = string.Empty;
     
    private void Page_Loaded(object sender, RoutedEventArgs e)
    {
        if (this.NavigationContext.QueryString["id"] != null)
        {
            id = this.NavigationContext.QueryString["id"];
            MessageBox.Show(id);
        }
        ...
    }
    mais ensuite... j'espère qu'il existe une solution rapide pour ça, récupérer une variable passée en paramètre devrait faire partie des bases, dont je ne dispose pas

  2. #2
    Invité
    Invité(e)
    Par défaut
    Si j'ai bien compris ton problème, en fait, tu as juste à indiquer ceci dans la page "enfant" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    protected override void OnNavigateTo(NavigationEventArgs e)
    {
          var qs = NavigationContext.QueryString;
     
          if(qs.ContainsKey("id"))
          {
                   source.FilterDescriptors.Add( 
                         new FilterDescriptor("cat", FilterOperator.IsEqualTo, qs["id"]));
          }
    }
    Dans ce cas, pas besoin d'ajouter de paramètre dans le Domain Data Source.



    Mais on peut imaginer de le faire d'une autre façon.

    Tu remplaces ton paramètre dans le Domain Data Source par ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <riaData:ControlParameter ParameterName="cat" ControlName="CatChoisi"
                                        PropertyName="Text"
                                        RefreshEventName="TextChanged" />
    Et ensuite, tu met ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    protected override void OnNavigateTo(NavigationEventArgs e)
    {
          var qs = NavigationContext.QueryString;
     
          if(qs.ContainsKey("id"))
          {
                   CatChoisi.Text = qs["id"];
          }
    }
    En gros, tu récupères l'id et tu le places dans un champ Text (invisible par exemple). Le DomainDataSource va repérer l'évenement TextChanged sur ce champ et va aussitot rafraichir les données en passant en paramètre ce qui se trouve dans la proprité Text du champ.

    On aurait également pu le faire avec un Filtre tjs sur le même principe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <riaData:FilterDescriptor x:Name="FiltreCat" PropertyPath="cat"
                                      Operator="IsEqualTo" >
         <riaData:ControlParameter ControlName="CatChoisi"
                                             PropertyName="Text"
                                              RefreshEventName="TextChanged" />
    </riaData:FilterDescriptor>
    Dans les deux derniers cas, il faut bien sur que tu crées le champ Text dans le code Xaml.

    J'espère que j'ai été clair et que j'ai pas dis de bétise

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 109
    Par défaut
    Fantastique !!

    ça a l'air d'être exactement ce qu'il me faut, merci d'avoir pris le temps de me formuler une belle réponse détaillée ^^

    un léger problème malheureusement (venant peut-être tout simplement de mon hermétisme à ce nouveau langage) : j''obtient une NullReferenceException sur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sourcesc.FilterDescriptors.Add(new FilterDescriptor("cat", FilterOperator.IsEqualTo, qs["id"]));
    qd["id"] existe et contient bien ma valeur si je l'affiche, apparemment ça vient du FilterDescriptor.Add() , il a pas trop envie...

    Merci encore ^^

    PS : le base.OnNavigatedTo(e); qui se met en place automatiquement dans la création de la procédure OnNavigatedTo(NavigationEventArgs e), je le laisse ? en début ou en fin de procédure ?

  4. #4
    Invité
    Invité(e)
    Par défaut
    Y'a pas une faute dans ton code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sourcesc.FilterDescriptors.Add(new FilterDescriptor("cat", FilterOperator.IsEqualTo, qs["id"]));
    C'est pas "source" le nom de ton DomainDataSource ? La tu as mis "sourcesc".

    Vérifie aussi le qs. D'un côté tu dis qs["id"], de l'autre qd["id"]. C'est l'un ou l'autre (c'est peut être juste une erreur dans ton post sur le forum bien sur).

    Pour ce qui est du base.OnNavigatedTo(e), ben moi j'avais rien du tout en fait au départ

    Par exemple, moi ça donne ça dans mon application :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // Executes when the user navigates to this page.
    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
         var qs = NavigationContext.QueryString;
     
         if (qs.ContainsKey("CliID"))
         {
               source.FilterDescriptors.Add(
               new FilterDescriptor("CustomerID",FilterOperator.IsEqualTo,qs["CliID"]));
          }
    }
    Tu as bien modifié ton DomainDataSource pour enlever le paramètre et tu as remplacé le nom de la requête en conséquence ? (en mettant une qui n'attend aucun paramètre).

    Sinon, je vois pas trop

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 109
    Par défaut
    ok, j'ai formulé ainsi et cela se passe bien mieux :

    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
     
    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
       base.OnNavigatedTo(e);
     
       var qs = this.NavigationContext.QueryString;
     
       FilterDescriptorCollection FDlist = new FilterDescriptorCollection();
     
       if (qs.ContainsKey("id"))
       {
          FDlist.Add(new FilterDescriptor("cat", FilterOperator.IsEqualTo, qs["id"]));
       }
       if (true)
       {
          FDlist.Add(new FilterDescriptor("niveau", FilterOperator.IsLessThanOrEqualTo, "0"));
       }
     
       sourcesc.FilterDescriptors = FDlist;
    }
    Je veux gérer un niveau de sécurité, mais je l'implémenterais plus tard, donc j'ai ajouté un filtre "inutile"

    mon problème est que ma liste d'objets ne s'affiche pas, donc il me faut rafraichir l'affichage certainement après cette liaison "sourcesc.FilterDescriptors = FDlist;"

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 109
    Par défaut
    Citation Envoyé par Hathortos Voir le message
    Tu as bien modifié ton DomainDataSource pour enlever le paramètre et tu as remplacé le nom de la requête en conséquence ? (en mettant une qui n'attend aucun paramètre)
    Merci de ta réponse,

    non je n'ai rien fait de tel... mais ça devrait me générer une erreur en débug si c'était nécessaire... non ? je vais chercher de ce côté merci

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par darkendorf Voir le message
    Merci de ta réponse,

    non je n'ai rien fait de tel... mais ça devrait me générer une erreur en débug si c'était nécessaire... non ? je vais chercher de ce côté merci
    Disons que vu que tu gères tout avec des filtres maintenant, ton paramètre n'a plus aucune utilité. Tu dois indiquer une requête qui récup toutes les données et les filtres agiront sur ces données. Ou alors quelque chose m'échape sur ce que tu veux faire.

    Car là, si tu met un filtre et un paramètre sur le même champ, ça peut poser pb. Ca peut expliquer l'absence de données.

    Pour ce qui est de la génération d'une erreur, non, je ne pense pas, car il n'y a pas d'erreur techniquement parlant.

  8. #8
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 109
    Par défaut
    Citation Envoyé par Hathortos Voir le message
    Disons que vu que tu gères tout avec des filtres maintenant, ton paramètre n'a plus aucune utilité.
    heu... je ne saisi pas, mes paramètres donnent les valeur à ma requète pour filtrer justement...

    dans mon Service.cs j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public IQueryable<SSCATEGORIE> GetSSCATEGORIEByNv(long cat, long niveau)
    {
       var ssCategoriesOfThisLevel =
          from sc in this.Context.SSCATEGORIE
          where sc.NIVEAU <= niveau
          where sc.IDCATEGORIE == cat
          orderby sc.ORDRE
          select sc;
       return ssCategoriesOfThisLevel;
    }
    Dans mon xaml, avant mon ItemsControl, j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <riaControls:DomainDataSource
          x:Name="sourcesc"
          QueryName="GetSSCATEGORIEByNv" 
          AutoLoad="True">
       <riaControls:DomainDataSource.DomainContext>
          <domain:DUCContext />
       </riaControls:DomainDataSource.DomainContext>
    </riaControls:DomainDataSource>
    Et dans mon code behind :

    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
     
    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
       base.OnNavigatedTo(e);
       var qs = this.NavigationContext.QueryString;
       FilterDescriptorCollection FDlist = new FilterDescriptorCollection();
       if (qs.ContainsKey("id"))
       {
           FDlist.Add(new FilterDescriptor("cat", FilterOperator.IsEqualTo, qs["id"]));
       }
       if (true)
       {
           FDlist.Add(new FilterDescriptor("niveau", FilterOperator.IsLessThanOrEqualTo, "0"));
       }
       sourcesc.FilterDescriptors = FDlist;
    }
    Je ne vois pas pourquoi tu me dis que je filtre deux fois...

    Par contre effectivement, avant d'appliquer mes FilterDescriptors, mon domainDataSource ne fournit pas les deux paramètres dont il a besoin...

    il faudrait donc selon toi que je lie un dataSource sans paramètres, et qu'ensuite je change le dataSource en fournissant les paramètres ?? sa commence à devenir fastidieux ^^

  9. #9
    Invité
    Invité(e)
    Par défaut
    Les Filtre et les paramètre, c'est pas la même chose.

    Imagines, mon domain service me renvoit une liste de client (sans paramètre). J'ajoute un filtre qui dit que je prend que ceux qui ont un nom qui commence par "A". Et bien j'ai rien d'autres à faire. Pas besoin de paramètre. Il va faire le travaille tout seul.

    Dans ton cas, les filtres ne vont pas remplir les paramètres de ta requête.

    Pour que ça fonctionne, tu crées une nouvelle méthode dans ton service.cs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public IQueryable<SSCATEGORIE> GetSSCATEGORIE()
    {
       return this.Context.SSCATEGORIE
    }
    Elle renvoit toutes les catégories.

    Tu modifies ton Domain Data Source en conséquence :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <riaControls:DomainDataSource
          x:Name="sourcesc"
          QueryName="GetSSCATEGORIE" 
          AutoLoad="True">
       <riaControls:DomainDataSource.DomainContext>
          <domain:DUCContext />
       </riaControls:DomainDataSource.DomainContext>
    </riaControls:DomainDataSource>
    Et enfin, tu modifies tes filtres (en gras les modif) :

    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 OnNavigatedTo(NavigationEventArgs e)
    {
       base.OnNavigatedTo(e);
       var qs = this.NavigationContext.QueryString;
       FilterDescriptorCollection FDlist = new FilterDescriptorCollection();
       if (qs.ContainsKey("id"))
       {
           FDlist.Add(new FilterDescriptor("IDCATEGORIE", FilterOperator.IsEqualTo, qs["id"]));
       }
       if (true)
       {
           FDlist.Add(new FilterDescriptor("NIVEAU", FilterOperator.IsLessThanOrEqualTo, "0"));
       }
       sourcesc.FilterDescriptors = FDlist;
    }
    Et c'est tout. Tes filtres vont justement filtrer les résultats.

    Là, ça pouvait pas marcher vu que tu dis à ton DomainDataSource de prendre la requête GetSSCATEGORIEByNv qui attend des paramètres mais tu passes aucun paramètre (puisque les filtres ne remplissent pas les paramètres). Les filtres agissent directement sur tes propriétés.

    J'espère avoir été clair

  10. #10
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 109
    Par défaut
    Houlà mais en fait je me suis embrouillé !!
    Je n'avais pas vu un "détail" dans tes exemples : la différence entre " <riaControlsomainDataSource.QueryParameters> " et " <riaData:FilterDescriptor ...> " bon je relis tout ça à tête reposée, et je vois dans mon code comment l'appliquer correctement ^^

  11. #11
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 109
    Par défaut ??
    Alléluia, Allah Akbar, etc...

    c'était tout bête en fait, si seulement je n'avais pas mélangé entre QueryParameters côté front et Filters côté code.

    Merci infiniment pour tes exemples et ta patience, ça marche du tonner !! enfin !!



    Je peux enfin passer à la suite !! il était temps

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Iserie Navigator passage paramètres
    Par jbg2xm8 dans le forum AS/400
    Réponses: 3
    Dernier message: 05/06/2014, 10h20
  2. probleme lors du passage de paramètre
    Par maxmj dans le forum ASP
    Réponses: 4
    Dernier message: 18/11/2003, 00h15
  3. [XSL] Passage de paramètres à un template
    Par pantin dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 27/06/2003, 13h28
  4. passage de paramètres
    Par pram dans le forum XMLRAD
    Réponses: 5
    Dernier message: 18/02/2003, 17h28
  5. passage en paramètre d'un array dynamique 2D
    Par Guigui_ dans le forum Langage
    Réponses: 4
    Dernier message: 27/11/2002, 19h47

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