none
ASP.NET Infos SQLDataSource dans ListView imbriquer RRS feed

  • Question

  • Bonsoir,

    Je réalise un site web et j'ai besoin de réaliser deux ListView imbriqué.

    Dans mon premier ListView apparaissent les entreprises, et le ListView enfant est composé des expériences qui ces mêmes entreprises.

    Problème : Il faut que mon SqlDataSource puisse prendre en paramètre l'entreprise en cours.

    Voici mon code :

    <div id="experiencePro">
            <div id="entreprise">
                <h1>
                    <asp:Literal ID="LiteralTitreExpPro" runat="server" Text="<%$Resources: CV,titreExpPro %>"></asp:Literal></h1>
                <div class="mesEntreprises">
                    <asp:ListView ID="ListViewMesEntreprises" runat="server" ViewStateMode="Disabled"
                        DataSourceID="SqlDataSourceEntreprise" >
                        <ItemTemplate>
                            <fieldset class="infoEntreprise">
                                <legend>
                                    <%#Eval("designation")%></legend>
                                <asp:HiddenField ID="HiddenFieldIdEntreprise" runat="server" Value='<%#Eval("identifiant") %>'
                                    EnableViewState="false" />
                                <label class="entrepriseActivite">
                                    <%#GetGlobalResourceObject("CV", Eval("activite").ToString())%></label>
                                <label class="entrepriseAdresse">
                                    <%#GetGlobalResourceObject("CV", Eval("adresse").ToString())%></label>
                                <label class="entrepriseCp">
                                    <%#Eval("cp") %></label>
                                <label class="entrepriseVille">
                                    <%#Eval("ville") %></label>
                                <label class="entreprisePays">
                                    <%#GetGlobalResourceObject("Pays", Eval("pays").ToString())%></label>
                                <label class="entrepriseTel">
                                    <%#Eval("tel") %></label>
                                <fieldset>
                                    <legend>
                                        <asp:Literal ID="LiteralTitreExperience" Text="<%$Resources: CV,TitreExperience %>"
                                            runat="server" EnableViewState="false"></asp:Literal></legend>
                                    <asp:ListView ID="ListViewExperience" runat="server" DataSourceID="SqlDataSourceExperience">
                                        <ItemTemplate>
                                        
                                        </ItemTemplate>
                                    </asp:ListView>
                                </fieldset>
                            </fieldset>
                        </ItemTemplate>
                    </asp:ListView>
                    <asp:SqlDataSource ID="SqlDataSourceEntreprise" runat="server" ConnectionString="<%$ ConnectionStrings:SiteProConnectionString %>"
                        SelectCommand="PS_LST_ENTREPRISE_SORTED" SelectCommandType="StoredProcedure">
                        
                    </asp:SqlDataSource>
                    <asp:SqlDataSource ID="SqlDataSourceExperience" runat="server" 
                        ConnectionString="<%$ ConnectionStrings:SiteProConnectionString %>" 
                        SelectCommand="SELECT debut, fin, description FROM Experience WHERE (FK_Entreprise = @entreprise) ORDER BY debut DESC">
                        <SelectParameters>
                            <asp:Parameter Name="entreprise" />
                        </SelectParameters>
                    </asp:SqlDataSource>
                </div>

    Le @entreprise doit donc être dynamiquement égal à l'entreprise du ListView maître.

    Bonne soirée


    mardi 13 mars 2012 21:44

Toutes les réponses

  • Bonjour,

    Une solution consiste à définir le DataSource de votre ListView enfant au niveau du handler de l'event ItemDataBound de la ListView parente :

            protected void ListViewMesEntreprises_ItemDataBound(object sender, ListViewItemEventArgs e)
            {
                if (e.Item.ItemType == ListViewItemType.DataItem)
                {
                    System.Data.DataRowView rowView = e.Item.DataItem as System.Data.DataRowView;
                    this.SqlDataSourceExperience.SelectParameters.Add("entreprise", rowView["identifiant"].ToString());
                    
                    var listViewExperience = (ListView)e.Item.FindControl("ListViewExperience");
                    listViewExperience.DataSource = this.SqlDataSourceExperience;
                    listViewExperience.DataBind();
    
                }
            }

    Dans le code asp, modifier le code de l'élément ListViewExperience car son DataSource est désormais défini dans le code :

    <asp:ListView ID="ListViewExperience"  runat="server" >
         <ItemTemplate>
                                        
         </ItemTemplate>
    </asp:ListView>

    Pour information je n'ai pas pu tester le code que je vous propose mais en gros l'idée est là.

    Pour plus de détails : http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.listview.itemdatabound.aspx

    Cordialement.


    mercredi 14 mars 2012 09:29
    Auteur de réponse
  • J'ai donc réalisé ce que vous m'avez conseillé et mes enregistrements n'apparaissent plus à l'écran car je pense que votre procédure prend le pas sur celle prévu par défaut, aurait-il un moyen de restaurer celle ci en plus de la procédure ci-dessus ?
    mercredi 14 mars 2012 10:52
  • mes enregistrements n'apparaissent plus à l'écran

    Les quels ? ceux de la listview parent ou enfant ?

    mercredi 14 mars 2012 11:00
    Auteur de réponse
  • Parent et enfant par extension.
    mercredi 14 mars 2012 17:33
  • Je ne sais pas trop comment m'y prendre pour adapter ton code mais je pense que la solution se situe au niveau de l'évènement on databound.
    mercredi 14 mars 2012 18:52
  •  

    Bonjour, Stephane,

    Est-ce que vous avez pu avancer en utilisant les infos fournies par Mourad ou vous avez encore besoin d’aide ?

    Bonne journée,

    Cipri


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    Ciprian DUDUIALA, MSFT  
    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.

    lundi 19 mars 2012 09:24
  • Comme j'ai dis, je pense que la solution se situe au niveau de l'évènement on databound plutôt que item databound après je n'ai toujours plus aucun enregistrement qui s'affiche.

    J'aimerai bien comprendre pourquoi au lieu de supprimer et recréer mes listview.

    lundi 19 mars 2012 14:00
  • Le DataBound est déclenché au niveau global du ListView alors que le ItemDataBound est déclenché pour chaque ligne. C'est donc bien dans celui là qu'il faut récupérer la liste des expériences pour la ligne.

    Le code cité plus me semble plutôt juste. Il doit y avoir un petit truc qui cloche quelque part mais pas bien grave à mon avis ;-)


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    mardi 20 mars 2012 09:27
  • Je suis partie sur des filtres dans ma page, mais ça ne m'affiche que le dernier enregistrement pour les expériences à chaque fois et non chaque expérience pour chaque entreprise.

    Exemple :

    Entreprise : 1. toto 2.tutu 3.titi

    ça affiche les expériences pour titi dans toutes les entreprises.

    protected void Page_Load(object sender, EventArgs e)
            {
                Session["entrepriseEnCours"] = "0";
            }
    
    protected void ListViewEntreprises_ItemCreated(object sender, ListViewItemEventArgs e)
            {
                string idEntrepriseEnCours = ListViewEntreprises.DataKeys[Convert.ToInt32(Session["entrepriseEnCours"])].Value.ToString();
                string filtreRequest = "FK_Entreprise = " + idEntrepriseEnCours;
                string toto = this.SqlDataSourceExp.FilterExpression;
                this.SqlDataSourceExp.FilterExpression = filtreRequest;
                Session["entrepriseEnCours"] = Convert.ToInt32(Session["entrepriseEnCours"]) + 1;
            }

    mardi 20 mars 2012 15:38