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

ASP.NET Discussion :

Liste dynamique et repeater imbriqués


Sujet :

ASP.NET

  1. #1
    Membre averti
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mars 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Mars 2011
    Messages : 60
    Par défaut Liste dynamique et repeater imbriqués
    Bonjour,

    Je souhaite afficher le contenu d'une liste dynamique (une List<object> de List<object> composée de string et booléens) dans un repeater.
    Comme je peux avoir un nombre non déterminé de lignes et de colonnes, j'ai pensé utiliser des repeater imbriqués.

    La première structure ASP à laquelle j'ai pensé est la suivante :
    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
    <asp:Repeater ID="rptListRepeater" runat="server">
        <HeaderTemplate>
            <h3><asp:Label ID="lblListTitle" runat="server"/></h3>
            <table class="admintable">
                <tr class="admintable_header">
                    <th />
                    <asp:Repeater ID="rptHeaderRepeater" runat="server">
                        <ItemTemplate>
                            <th><asp:Label ID="lblLevelName" runat="server" Text="<%# Container.DataItem %>" /></th>
                        </ItemTemplate>
                    </asp:Repeater>
                </tr>
        </HeaderTemplate>
        <ItemTemplate>
                <tr class="admintable_cell">
                    <asp:Repeater ID="rptContentRepeater" runat="server">
                        <ItemTemplate>
                            <td><asp:Label ID="lblFieldName" runat="server" Text="" /></td>
                            <td><asp:CheckBox ID="cbFieldVisibility" runat="server" Checked="false" OnCommand="UpdateVisibility_Click" CommandArgument="" /></td>
                        </ItemTemplate>
                    </asp:Repeater>
                </tr>
        </ItemTemplate>
        <FooterTemplate>
            </table>
        </FooterTemplate>
    </asp:Repeater>
    Avec cette structure, j'avais du mal à ressortir mes données. J'ai donc pensé à une structure différente :
    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
    <h3><asp:Label ID="lblListTitle" runat="server"/></h3>
    <table class="admintable">
        <tr class="admintable_header">
            <th/>
            <asp:Repeater ID="rptHeaderRepeater" runat="server">
                <ItemTemplate>
                    <th><asp:Label ID="lblLevelName" runat="server" Text="<%# Container.DataItem %>" /></th>
                </ItemTemplate>
            </asp:Repeater>
        </tr>
        <asp:Repeater ID="rptContentRepeater" runat="server">
            <ItemTemplate>
                <tr class="admintable_cell">
                    <asp:Repeater ID="rptDataRepeater" runat="server">
                        <ItemTemplate>
                            <td>
                                <asp:Label ID="lblFieldName" runat="server" />
                                <asp:CheckBox ID="cbFieldVisibility" runat="server" OnCommand="UpdateVisibility_Click" CommandArgument="" />
                            </td>
                        </ItemTemplate>
                    </asp:Repeater>
                </tr>
            </ItemTemplate>
        </asp:Repeater>
    </table>
    Mon code behind associé est le suivant :
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Data.SqlClient;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Xml;
    using System.Xml.Linq;
    using ThoughtReader.Common;
    using ThoughtReader.DataAccess;
    using ThoughtReader.WebSite.Classes;
     
    namespace ThoughtReader.WebSite.UserControls
    {
        public partial class LevelManager : System.Web.UI.UserControl
        {
            private int iSubRepeaterItemCounter;
            private List<object> lDataList;
     
            protected void Page_Load(object sender, EventArgs e)
            {
                if (!IsPostBack)
                {
                    lDataList = GetAllData();
                    PopulateList();
                }
            }
     
            private void PopulateList()
            {
                try
                {
                    lblListTitle.Text = "User right configuration";
     
                    rptHeaderRepeater.DataSource = GetHeaderData();
                    rptHeaderRepeater.DataBind();
     
                    rptContentRepeater.ItemDataBound += new RepeaterItemEventHandler(rptContentRepeater_ItemDataBound);
                    rptContentRepeater.DataSource = GetContentData();
                    rptContentRepeater.DataBind();
                }
                catch (Exception ex)
                {
                    AppLogManager.WebSiteLogError(ex.Message, ex.StackTrace);
                }
            }
     
            private void rptContentRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
            {
                List<object> lContentDataList = lContentDataList = GetContentData();
                Repeater rptDataRepeater = (RepeaterFunctions.FindControl(rptContentRepeater, "rptDataRepeater") as Repeater);
                rptDataRepeater.ItemDataBound += new RepeaterItemEventHandler(rptDataRepeater_ItemDataBound);
                rptDataRepeater.DataSource = lContentDataList[iSubRepeaterItemCounter];
                rptDataRepeater.DataBind();
                iSubRepeaterItemCounter += 1;
            }
     
            private void rptDataRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
            {
                Repeater rptDataRepeater = (RepeaterFunctions.FindControl(rptContentRepeater, "rptDataRepeater") as Repeater);
                Label lblFieldName = (RepeaterFunctions.FindControl(rptDataRepeater, "lblFieldName") as Label);
                CheckBox cbFieldVisibility = (RepeaterFunctions.FindControl(rptDataRepeater, "cbFieldVisibility") as CheckBox);
                if (e.Item.DataItem.ToString() == "true" || e.Item.DataItem.ToString() == "false")
                {
                    lblFieldName.Visible = false;
                    cbFieldVisibility.Visible = true;
                    cbFieldVisibility.Checked = Convert.ToBoolean(e.Item.DataItem.ToString());
                }
                else
                {
                    cbFieldVisibility.Visible = false;
                    lblFieldName.Visible = true;
                    lblFieldName.Text = e.Item.DataItem.ToString();
                }
            }
     
            private List<object> GetHeaderData()
            {
                return ((List<string>)lDataList[0]).Cast<object>().ToList();
            }
     
            private List<object> GetContentData()
            {
                List<object> lContentList = new List<object>();
                for (int i = 1; i < lDataList.Count(); i++)
                    lContentList.Add(lDataList[i]);
                return lContentList;
            }
     
            private List<object> GetAllData()
            {
                try
                {
                    using (ThoughtReaderContainer oContainer = new ThoughtReaderContainer())
                    {
                        List<object> lData = new List<object>();
     
                        var oLevelList = (from l in oContainer.UserLevelSet
                                          orderby l.UL_MinimalPoint ascending
                                          select l).ToList();
     
                        List<string> lHeader = new List<string>();
                        lHeader.Add("");
                        foreach (var oLevel in oLevelList)
                        {
                            lHeader.Add(oLevel.UL_Name);
                        }
                        lData.Add(lHeader);
     
                        foreach (var oField in (from f in oContainer.UserFieldVisibilitySet select f.UFV_FieldName).Distinct().ToList())
                        {
                            List<object> lContent = new List<object>();
                            lContent.Add(oField);
                            foreach (var oLevel in oLevelList)
                            {
                                lContent.Add((from f in oContainer.UserFieldVisibilitySet
                                              where f.UFV_FieldName == oField && f.UFV_UserLevelId == oLevel.UL_Id
                                              select f.UFV_IsVisible).FirstOrDefault());
                            }
                            lData.Add(lContent);
                        }
                        return lData;
                    }
                }
                catch (Exception ex)
                {
                    AppLogManager.WebSiteLogError(ex.Message, ex.StackTrace);
                    return null;
                }
            }
        }
    }
    Je pense être proche de la solution mais j'ai encore deux problèmes :
    - Le résultat retourné dans le contenu de mon tableau ne correspond qu'au dernier enregistrement retourné, les autres ne s'affichent pas
    - La structure HTML générée ne correspond pas à ce que j'ai utilisé (mes balises ne se ferment pas)

    J'avoue sécher un peu là. Quelle est mon erreur ?

    Merci à tous.
    Max

  2. #2
    Membre averti
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mars 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Mars 2011
    Messages : 60
    Par défaut
    Salut,

    Bon, j'ai trouvé l'erreur qui faisait péter mon HTML généré (un <th /> en trop qui trainait en début de ligne).

    Je me suis donc remis les yeux en face des trous mais je n'arrive toujours pas à solutionner mon problème de résultat affiché.
    En effet, mon repeater affiche, pour chaque cellule, le valeur du dernier enregistrement de la liste.

    Voilà donc mon code asp mis à jour (pour info) :
    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
    <h3><asp:Label ID="lblListTitle" runat="server"/></h3>
    <table class="admintable">
        <tr class="admintable_header">
            <asp:Repeater ID="rptHeaderRepeater" runat="server">
                <ItemTemplate>
                    <th><asp:Label ID="lblLevelName" runat="server" Text="<%# Container.DataItem %>" /></th>
                </ItemTemplate>
            </asp:Repeater>
        </tr>
        <asp:Repeater ID="rptContentRepeater" runat="server">
            <ItemTemplate>
                <tr class="admintable_cell">
                    <asp:Repeater ID="rptDataRepeater" runat="server">
                        <ItemTemplate>
                            <td>
                                <asp:Label ID="lblFieldName" runat="server" />
                                <asp:CheckBox ID="cbFieldVisibility" runat="server" OnCommand="UpdateVisibility_Click" CommandArgument="" />
                            </td>
                        </ItemTemplate>
                    </asp:Repeater>
                </tr>
            </ItemTemplate>
        </asp:Repeater>
    </table>
    Mais comme le problème se situe dans mon code behind (je pense), voilà pour rappel ce que j'ai codé :
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    public partial class LevelManager : System.Web.UI.UserControl
    {
    	private int iSubRepeaterItemCounter;
    	private List<object> lDataList;
     
    	protected void Page_Load(object sender, EventArgs e)
    	{
    		if (!IsPostBack)
    		{
    			lDataList = GetAllData();
    			PopulateList();
    		}
    	}
     
    	private void PopulateList()
    	{
    		try
    		{
    			lblListTitle.Text = "User right configuration";
     
    			rptHeaderRepeater.DataSource = GetHeaderData();
    			rptHeaderRepeater.DataBind();
     
    			rptContentRepeater.DataSource = GetContentData();
    			rptContentRepeater.ItemDataBound += new RepeaterItemEventHandler(rptContentRepeater_ItemDataBound);
    			rptContentRepeater.DataBind();
    		}
    		catch (Exception ex)
    		{
    			AppLogManager.WebSiteLogError(ex.Message, ex.StackTrace);
    		}
    	}
     
    	private void rptContentRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
    	{
    		List<object> lContentDataList = GetContentData();
    		Repeater rptDataRepeater = (RepeaterFunctions.FindControl(rptContentRepeater, "rptDataRepeater") as Repeater);
     
    		rptDataRepeater.DataSource = lContentDataList[iSubRepeaterItemCounter];
    		rptDataRepeater.ItemDataBound += new RepeaterItemEventHandler(rptDataRepeater_ItemDataBound);
    		rptDataRepeater.DataBind();
     
    		iSubRepeaterItemCounter += 1;
    	}
     
    	private void rptDataRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
    	{
    		Repeater rptDataRepeater = (RepeaterFunctions.FindControl(rptContentRepeater, "rptDataRepeater") as Repeater);
    		Label lblFieldName = (RepeaterFunctions.FindControl(rptDataRepeater, "lblFieldName") as Label);
    		CheckBox cbFieldVisibility = (RepeaterFunctions.FindControl(rptDataRepeater, "cbFieldVisibility") as CheckBox);
     
    		lblFieldName.Text = e.Item.DataItem.ToString();
    		if (e.Item.DataItem.ToString() == "True" || e.Item.DataItem.ToString() == "False")
    		{
    			cbFieldVisibility.Checked = Convert.ToBoolean(e.Item.DataItem.ToString());
    			lblFieldName.Visible = false;
    			cbFieldVisibility.Visible = true;
    		}
    		else
    		{
    			lblFieldName.Visible = true;
    			cbFieldVisibility.Visible = false;
    		}
    	}
     
    	private List<object> GetHeaderData()
    	{
    		return ((List<string>)lDataList[0]).Cast<object>().ToList();
    	}
     
    	private List<object> GetContentData()
    	{
    		List<object> lContentList = new List<object>();
    		for (int i = 1; i < lDataList.Count(); i++)
    			lContentList.Add(lDataList[i]);
    		return lContentList;
    	}
     
    	private List<object> GetAllData()
    	{
    		try
    		{
    			using (ThoughtReaderContainer oContainer = new ThoughtReaderContainer())
    			{
    				List<object> lData = new List<object>();
     
    				var oLevelList = (from l in oContainer.UserLevelSet
    								  orderby l.UL_MinimalPoint ascending
    								  select l).ToList();
     
    				List<string> lHeader = new List<string>();
    				lHeader.Add("");
    				foreach (var oLevel in oLevelList)
    				{
    					lHeader.Add(oLevel.UL_Name);
    				}
    				lData.Add(lHeader);
     
    				foreach (var oField in (from f in oContainer.UserFieldVisibilitySet select f.UFV_FieldName).Distinct().ToList())
    				{
    					List<object> lContent = new List<object>();
    					lContent.Add(oField);
    					foreach (var oLevel in oLevelList)
    					{
    						lContent.Add((from f in oContainer.UserFieldVisibilitySet
    									  where f.UFV_FieldName == oField && f.UFV_UserLevelId == oLevel.UL_Id
    									  select f.UFV_IsVisible).FirstOrDefault());
    					}
    					lData.Add(lContent);
    				}
    				return lData;
    			}
    		}
    		catch (Exception ex)
    		{
    			AppLogManager.WebSiteLogError(ex.Message, ex.StackTrace);
    			return null;
    		}
    	}
    }
    Je suppose que je manipule mal mes _ItemDataBound() mais je ne sais pas trop comment corriger ça.

    Need help !

  3. #3
    Membre averti
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mars 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Mars 2011
    Messages : 60
    Par défaut
    Salut à tous,

    A nouveau un peu de temps pour bosser sur ce sujet, j'ai donc repris le travail.
    Je suppose que mon problème vient de ma gestion des évennements _ItemDataBound, je me suis donc dit que j'allais essayer en passant par les évennements _ItemCreated mais rien n'y fait.

    Est-ce que quelqu'un a une piste pour solutionner ce problème de tableau dynamique (colonnes et lignes) ?

    Merci d'avance.

Discussions similaires

  1. Faire une checkbox list dynamique dans un repeater
    Par oclone dans le forum ASP.NET
    Réponses: 15
    Dernier message: 23/02/2009, 20h15
  2. afficher les contenu d'une liste dynamiquement
    Par mzt.insat dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 06/04/2006, 18h02
  3. [PHP-JS] Liste dynamique
    Par SuperBn dans le forum Langage
    Réponses: 4
    Dernier message: 09/02/2006, 17h09
  4. Réponses: 1
    Dernier message: 16/01/2006, 17h36
  5. Rafraichissement liste dynamique
    Par Petitjean_85 dans le forum ASP
    Réponses: 5
    Dernier message: 14/06/2004, 10h21

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