none
Réflexion sur DataList RRS feed

  • Question

  • Bonjour tout le monde,

    Je veux présenter une collection d'annonces avec les publications associées dans des journaux.

    Sur la page ConsulterAnnoncesJournaux, j'ai d'abord créé une DataSource dsAnnonces et un Repeater qui lui est lié.

    Pour chaque annonce, après les éléments intrinsèques de l'annonce comme le texte, le mail et la ville, le Repeater inclut une DataList qui présente les publications liées à l'annonce en cours de traitement.

    Jusque là ça marche, maintenant je m'occupe de mettre des entêtes de colonnes au tableau de publications, dans le HeaderTemplate de la DataList.

    La seule difficulté est de cacher les entêtes de colonnes pour les annonces qui ne comportent pas de publication.

    A moins que j'aie raté quelque chose, il me semble qu'il faut faire ça par code, à partir de l'événement Selected de dsJournaux, la DataSource qui comporte les publications de l'annonce concernée.
    dsJournaux est dans l'ItemTemplate du Reapeater, juste après la table qu'il contient.

    Plus précisément, ce qui ne se fait pas dans l'élan initial, est de désigner à partir de là le Panel que j'ai mis dans le HeaderTemplate de la DataList, afin de gérer sa visibilité.

    J'arrive jusqu'à la DataList comme ceci :

            DataList L = ((DataList)Page.Controls[0].FindControl("Form1").FindControl("Main").FindControl("Repeater1").Controls[0].FindControl("DataList1"));
    


    Mais après, la DataList n'a pas de contrôle enfant, alors qu'elle inclut bien un HeaderTemplate et un ItemTemplate, avec chacun des contrôles. Du coup je me demande comment aller plus loin.

    Est-ce qu'il faut tout le code de la page, ou j'arrive à être assez clair ?

    • Modifié Gloops mercredi 8 mai 2013 18:57
    mercredi 8 mai 2013 18:53

Réponses

  • Aussi, regardez ce thread:

    http://social.msdn.microsoft.com/Forums/en-US/csharplanguage/thread/84165c94-16b1-4092-9b34-6203eba38649/

    Effectivement, ceci m'a permis de solutionner le problème plus élégamment, à ceci près que pour une raison que je ne m'explique pas, l'événement Datalist_ItemCommand ne s'exécute pas.

    Bien sûr j'avais déclaré, en propriété de DataList1, OnItemCommand="Datalist_ItemCommand", mais j'ai mis un point d'arrêt dans la procédure portant ce nom et je ne suis jamais passé dessus.

    Donc, s'agissant d'une DataList DataList1 alimentée par un DataSet dsJournaux, j'ai utilisé dsJournaux_Selected pour connaître le nombre de publications, et je l'exploite dans Datalist1_ItemDataBound pour rendre l'entête visible ou non, après avoir passé le nombre de l'une à l'autre en l'ayant déclaré au niveau module. Pour rappel, PanelEntete est un panel qui inclut les contrôles présents dans l'entête de la DataList. Si il y a plus sobre, bien sûr, je suis preneur ...

    La première des deux procédures événementielles a bien essayé d'obtenir ce résultat par L.ShowHeader, mais le résultat n'a pas été à la hauteur des espérances, puisque certes le deuxième entête, sous lequel apparaissent des données, est visible, mais les suivants, qui eux ne comportent pas de données, aussi. Alors, je me suis rabattu sur la solution de fractionner le traitement : dsJournaux_Selected pour connaître le nombre de publications, DataList1_ItemDataBound pour l'exploiter dans l'affichage de la DataList.

    protected void dsJournaux_Selected(object sender, SqlDataSourceStatusEventArgs e) { DataList L = ((DataList)Page.Controls[0].FindControl("Form1").FindControl("Main").FindControl("Repeater1").Controls[0].FindControl("DataList1")); L.ShowHeader = false; L.ShowHeader = (e.AffectedRows > 0) ;

    // Les lignes précédentes s'avèrent finalement inutiles

    // jusqu'à plus ample explication iNb = e.AffectedRows; // iNb est déclaré au niveau module } protected void DataList1_ItemDataBound(object sender, DataListItemEventArgs e) { if(e.Item.ItemType == ListItemType.Header) e.Item.FindControl("PanelEntete").Visible = (iNb > 0); }

    A l'usage des gens qui s'intéressent à la réflexion pour d'autres motivations, je mets quand même le code de la page, ce qui permettra de creuser ma première question :

    <%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="ConsulterAnnoncesJournaux.aspx.cs" Inherits="ConsulterAnnoncesJournaux" Title="[ASR : ] Publications des annonces" %>
    <asp:Content ID="Content1" ContentPlaceHolderID="Main" Runat="Server">
        <asp:SqlDataSource ID="dsAnnonces" runat="server" ConnectionString="<%$ ConnectionStrings:AffairesSansRisque_DataConnectionString1 %>"
            SelectCommand="SELECT * FROM [Annonces]"></asp:SqlDataSource>
        &nbsp;
        <asp:Repeater ID="Repeater1" runat="server"  DataSourceID="dsAnnonces" DataMember="DefaultView">
            <ItemTemplate>
                <table cellpadding="0" width="100%">
                  <tr>
                  <td>
                  <asp:Label runat="server" ID="Ann_Email" Text='<%# Eval("Ann_Email") %>'></asp:Label>
                  <asp:Label runat="server" ID="Ann_CodePostal" Text='<%# Eval("Ann_CodePostal") %>' Width="1cm" Height="15px" EnableTheming="false"></asp:Label>
                  <asp:Label runat="server" ID="Ann_Ville" Text='<%# Eval("Ann_Ville") %>'></asp:Label>
                  <asp:Panel ID="PanelTexte" runat="server" BorderWidth="1" BorderStyle="Dotted">
                    <asp:Label runat="server" ID="Ann_ID" Text='<%# Eval("Ann_ID") %>' ForeColor="#E0E0E0" EnableTheming="false"></asp:Label>
                    <asp:Literal runat="server" ID="Label2" Text='<%# Eval("Ann_Texte") %>' />
                  </asp:Panel>
                  </td></tr>
                </table>
                      <asp:SqlDataSource ID="dsJournaux" runat="server" ConnectionString="<%$ ConnectionStrings:AffairesSansRisque_DataConnectionString1 %>" SelectCommand="SELECT *, CAST(Jou_Tirage AS Int) As Tirage FROM [ListeJournauxParAnnonce] WHERE ([Ann_Id] = @Ann_Id)"  
                            OnSelected="dsJournaux_Selected">
                            <SelectParameters>
                                <asp:ControlParameter ControlID="Ann_ID" Name="Ann_Id" PropertyName="Text" Type="Int32" />
                            </SelectParameters>
                      </asp:SqlDataSource>
                      <asp:DataList ID="DataList1" runat="server" DataSourceID="dsJournaux" 
                            OnItemDataBound="DataList1_ItemDataBound">
                        <HeaderTemplate>
                            <asp:Panel ID="PanelEntete" runat="server">
                            <table cellpadding="0" cellspacing="0"><th style="border-bottom:solid">
                            <td style="width:1cm"></td>
                            <td style="width:4cm"><span style="text-decoration:underline">Publication</span></td>
                            <td align="right"><span style="text-decoration:underline"> Tirage</span></td>
                            <td>&nbsp; - <span style="text-decoration:underline">Limite dépôt</span></td>
                            </th><tr>
                            </asp:Panel>
                        </HeaderTemplate>
                        <ItemTemplate>
                            <td style="width:1cm"></td><td style="width:4cm">
                                <asp:Label ID="Label1" runat="server" Text='<%# Eval("Jou_Publication") %>' EnableTheming="false"></asp:Label>
                                </td><td style="" align="right">
                                <asp:Label ID="Label3" runat="server" Text='<%# Eval("Tirage", "{0:#,##0}") %>' EnableTheming="false"></asp:Label>
                                </td><td style="">&nbsp; - 
                                <asp:Label ID="Label4" runat="server" Text='<%# Eval("Jou_LimiteDepot") %>' EnableTheming="false"></asp:Label>
                            </td>
                        </ItemTemplate>
                        <FooterTemplate>
                            </tr></table>
                        </FooterTemplate>
                      </asp:DataList>
                
            </ItemTemplate>
        </asp:Repeater>
    </asp:Content>
    Pour faciliter les tests on peut souhaiter accéder à la base de données, elle est fournie avec le coach Microsoft de création d'un site web en 12 ateliers





    • Modifié Gloops vendredi 10 mai 2013 15:26
    • Marqué comme réponse Gloops vendredi 10 mai 2013 17:00
    vendredi 10 mai 2013 14:51

Toutes les réponses

  • Bonjour

    Sera très difficile de trouver une réponse sans voir comment les contrôles sont places un dans l'autre.

    Utilisez le debugger pour observer les valeurs de Page.Controls[0].FindControl("Form1")..............

    Je ne suis pas sûr que vous avez le bon DataList  (je soupçonne que vous recouperez toujours le premier DataList).

    Essayez de utiliser le debugger pour comparer le ID de DataList avec le ID que vous voyez avec click droite/view Source.

    Cordialement,


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    vendredi 10 mai 2013 11:50
  • Aussi, regardez ce thread:

    http://social.msdn.microsoft.com/Forums/en-US/csharplanguage/thread/84165c94-16b1-4092-9b34-6203eba38649/

    Effectivement, ceci m'a permis de solutionner le problème plus élégamment, à ceci près que pour une raison que je ne m'explique pas, l'événement Datalist_ItemCommand ne s'exécute pas.

    Bien sûr j'avais déclaré, en propriété de DataList1, OnItemCommand="Datalist_ItemCommand", mais j'ai mis un point d'arrêt dans la procédure portant ce nom et je ne suis jamais passé dessus.

    Donc, s'agissant d'une DataList DataList1 alimentée par un DataSet dsJournaux, j'ai utilisé dsJournaux_Selected pour connaître le nombre de publications, et je l'exploite dans Datalist1_ItemDataBound pour rendre l'entête visible ou non, après avoir passé le nombre de l'une à l'autre en l'ayant déclaré au niveau module. Pour rappel, PanelEntete est un panel qui inclut les contrôles présents dans l'entête de la DataList. Si il y a plus sobre, bien sûr, je suis preneur ...

    La première des deux procédures événementielles a bien essayé d'obtenir ce résultat par L.ShowHeader, mais le résultat n'a pas été à la hauteur des espérances, puisque certes le deuxième entête, sous lequel apparaissent des données, est visible, mais les suivants, qui eux ne comportent pas de données, aussi. Alors, je me suis rabattu sur la solution de fractionner le traitement : dsJournaux_Selected pour connaître le nombre de publications, DataList1_ItemDataBound pour l'exploiter dans l'affichage de la DataList.

    protected void dsJournaux_Selected(object sender, SqlDataSourceStatusEventArgs e) { DataList L = ((DataList)Page.Controls[0].FindControl("Form1").FindControl("Main").FindControl("Repeater1").Controls[0].FindControl("DataList1")); L.ShowHeader = false; L.ShowHeader = (e.AffectedRows > 0) ;

    // Les lignes précédentes s'avèrent finalement inutiles

    // jusqu'à plus ample explication iNb = e.AffectedRows; // iNb est déclaré au niveau module } protected void DataList1_ItemDataBound(object sender, DataListItemEventArgs e) { if(e.Item.ItemType == ListItemType.Header) e.Item.FindControl("PanelEntete").Visible = (iNb > 0); }

    A l'usage des gens qui s'intéressent à la réflexion pour d'autres motivations, je mets quand même le code de la page, ce qui permettra de creuser ma première question :

    <%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="ConsulterAnnoncesJournaux.aspx.cs" Inherits="ConsulterAnnoncesJournaux" Title="[ASR : ] Publications des annonces" %>
    <asp:Content ID="Content1" ContentPlaceHolderID="Main" Runat="Server">
        <asp:SqlDataSource ID="dsAnnonces" runat="server" ConnectionString="<%$ ConnectionStrings:AffairesSansRisque_DataConnectionString1 %>"
            SelectCommand="SELECT * FROM [Annonces]"></asp:SqlDataSource>
        &nbsp;
        <asp:Repeater ID="Repeater1" runat="server"  DataSourceID="dsAnnonces" DataMember="DefaultView">
            <ItemTemplate>
                <table cellpadding="0" width="100%">
                  <tr>
                  <td>
                  <asp:Label runat="server" ID="Ann_Email" Text='<%# Eval("Ann_Email") %>'></asp:Label>
                  <asp:Label runat="server" ID="Ann_CodePostal" Text='<%# Eval("Ann_CodePostal") %>' Width="1cm" Height="15px" EnableTheming="false"></asp:Label>
                  <asp:Label runat="server" ID="Ann_Ville" Text='<%# Eval("Ann_Ville") %>'></asp:Label>
                  <asp:Panel ID="PanelTexte" runat="server" BorderWidth="1" BorderStyle="Dotted">
                    <asp:Label runat="server" ID="Ann_ID" Text='<%# Eval("Ann_ID") %>' ForeColor="#E0E0E0" EnableTheming="false"></asp:Label>
                    <asp:Literal runat="server" ID="Label2" Text='<%# Eval("Ann_Texte") %>' />
                  </asp:Panel>
                  </td></tr>
                </table>
                      <asp:SqlDataSource ID="dsJournaux" runat="server" ConnectionString="<%$ ConnectionStrings:AffairesSansRisque_DataConnectionString1 %>" SelectCommand="SELECT *, CAST(Jou_Tirage AS Int) As Tirage FROM [ListeJournauxParAnnonce] WHERE ([Ann_Id] = @Ann_Id)"  
                            OnSelected="dsJournaux_Selected">
                            <SelectParameters>
                                <asp:ControlParameter ControlID="Ann_ID" Name="Ann_Id" PropertyName="Text" Type="Int32" />
                            </SelectParameters>
                      </asp:SqlDataSource>
                      <asp:DataList ID="DataList1" runat="server" DataSourceID="dsJournaux" 
                            OnItemDataBound="DataList1_ItemDataBound">
                        <HeaderTemplate>
                            <asp:Panel ID="PanelEntete" runat="server">
                            <table cellpadding="0" cellspacing="0"><th style="border-bottom:solid">
                            <td style="width:1cm"></td>
                            <td style="width:4cm"><span style="text-decoration:underline">Publication</span></td>
                            <td align="right"><span style="text-decoration:underline"> Tirage</span></td>
                            <td>&nbsp; - <span style="text-decoration:underline">Limite dépôt</span></td>
                            </th><tr>
                            </asp:Panel>
                        </HeaderTemplate>
                        <ItemTemplate>
                            <td style="width:1cm"></td><td style="width:4cm">
                                <asp:Label ID="Label1" runat="server" Text='<%# Eval("Jou_Publication") %>' EnableTheming="false"></asp:Label>
                                </td><td style="" align="right">
                                <asp:Label ID="Label3" runat="server" Text='<%# Eval("Tirage", "{0:#,##0}") %>' EnableTheming="false"></asp:Label>
                                </td><td style="">&nbsp; - 
                                <asp:Label ID="Label4" runat="server" Text='<%# Eval("Jou_LimiteDepot") %>' EnableTheming="false"></asp:Label>
                            </td>
                        </ItemTemplate>
                        <FooterTemplate>
                            </tr></table>
                        </FooterTemplate>
                      </asp:DataList>
                
            </ItemTemplate>
        </asp:Repeater>
    </asp:Content>
    Pour faciliter les tests on peut souhaiter accéder à la base de données, elle est fournie avec le coach Microsoft de création d'un site web en 12 ateliers





    • Modifié Gloops vendredi 10 mai 2013 15:26
    • Marqué comme réponse Gloops vendredi 10 mai 2013 17:00
    vendredi 10 mai 2013 14:51
  • Aussi, regardez ce thread:

    http://social.msdn.microsoft.com/Forums/en-US/csharplanguage/thread/84165c94-16b1-4092-9b34-6203eba38649/


    Bon alors ceci m'a amené à la solution, sans pour autant que je puisse l'appliquer tel quel.

    Est-ce que je le marque comme solution ?

    vendredi 10 mai 2013 14:55
  • Sur un autre sujet, mais utilisant la même infrastructure : pour sensibiliser les développeurs aux conséquences d'une erreur de type de données, la base est fournie avec une vue ListeJournauxParAnnonces, qui fournit le tirage d'un journal sous la forme d'une chaîne de caractères.

    Si on souhaite séparer les milliers, la syntaxe Eval("Jou_Tirage", "{0:#,##0} ne va opérer aucune modification.

    On a alors deux solutions. Ou utiliser une autre requête, qui elle va fournir le tirage sous forme numérique, comme j'ai illustré ci-dessus, ou introduire une fonction de mise en forme, qu'on pourra placer dans le même module si on est sûr de n'en avoir besoin que dans une page, ou dans une classe statique :

        public static string convchainenum(string chaineentree)
        {
            return (Int32.Parse(chaineentree).ToString("N0"));
        }

    Ceci sort une autre chaîne de caractères, correspondant à la mise en forme du nombre représenté par celle reçue en argument. N signifie numérique, ce qui va séparer les milliers, 0 indique qu'on ne veut pas de décimales.


    • Modifié Gloops vendredi 10 mai 2013 15:52
    vendredi 10 mai 2013 15:46
  • Utilisez le debugger pour observer les valeurs de Page.Controls[0].FindControl("Form1")..............

    Au fait, comment ça marche, ça ?

    Le debugger, c'est bien ce qui est parfois lancé par DrWatson quand l'application lance une exception non gérée ?

    Ou bien il s'agissait tout simplement de la fenêtre d'exécution ?

    • Modifié Gloops vendredi 10 mai 2013 16:46
    vendredi 10 mai 2013 16:46
  • Bon alors ceci m'a amené à la solution, sans pour autant que je puisse l'appliquer tel quel. Est-ce que je le marque comme solution ?

    Vous pouvez marquer votre réponse (ou vous donnez plus de détails) sans aucun problème. Ou vous pouvez marquer les deux.

    Cordialement,


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    vendredi 10 mai 2013 16:51