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