Bonjour.

Je suis face à un soucis pour faire ma page web. Je travaille avec VS 2015 et je fais une appli web en C# et .Net.

Je suis sur une page ListProduits qui m'affiche tous les produits de ma base de données dans une ListView. Je souhaiterait dans un premier temps ajouter au-dessus des champs de recherche. Pour cela, les DataList en HTML5 convenaient parfaitement. J'ai vu qu'il existait les mêmes balises en asp et j'ai donc voulu m'en servir.

J'ai cru comprendre que pour remplir les champs possibles de la DataList, il me fallait créer une DataView, bref j'ai suivi le tuto disponible sur le msdn.

J'ai donc un code comme ceci :
ListeProduits.aspx.cs
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
 
protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                ListeProduits.DataSource = CreateDataSource();
                DataBind();
            }
        }
 
ICollection CreateDataSource()
        {
 
            // Create sample data for the DataList control.
            DataTable dt = new DataTable();
            DataRow dr;
 
            var _db = new Akebia.Models.ProduitContext();
            IQueryable<Produit> query = _db.Produit;
            List<Produit> listeProduits = query.ToList();
 
            // Définir les colonnes de la table.
            dt.Columns.Add(new DataColumn("Code article", typeof(long)));
            dt.Columns.Add(new DataColumn("Reerence", typeof(String)));
            dt.Columns.Add(new DataColumn("Libelle", typeof(String)));
            dt.Columns.Add(new DataColumn("Prix", typeof(int)));
 
            // Remplir les lignes avec les valeurs de la table            
            foreach (Produit produit in listeProduits)
            {
                dr = dt.NewRow();
 
                dr[0] = produit.CodeArticle;
                dr[1] = produit.Reference;
                dr[2] = produit.Libelle;
                dr[3] = produit.PrixVente;
 
                dt.Rows.Add(dr);
            }
 
            DataView dv = new DataView(dt);
            return dv;
        }
Plus d'autres fonctions qui servent à remplir la ListView.

ListeProduits.aspx
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
 <asp:DataList id="listeProduits" runat="server" >
                <ItemTemplate>
                    Code article: <br />
                    <%# DataBinder.Eval(Container.DataItem, "Code article") %>
                </ItemTemplate>
            </asp:DataList>
 
 <asp:ListView ID="nimp" runat="server" 
                DataKeyNames="CodeArticle" GroupItemCount="4"
                ItemType="Akebia.Models.Produit" SelectMethod="GetProduits">
                [là je remplis ma liste...]
</asp:ListView>
Or, je découvre que l'ID des balises semble important car mettre "listProduits" en ID de DataList me retourne l'erreur suivante :
La classe de base comporte le champ "listeProduits" mais son type (Controls.ListView) n'est pas compatible avec le type du contenu (Controls.DataList).
Alors je ne comprends pas pourquoi :
  1. Quel que soit l'ID que je met pour la balise ListView, celui-ci est accepté et l'affichage fonctionne
  2. Ceci n'est pas vrai pour la DataList
  3. Je n'ai pas le droit d'utiliser le même ID pour 2 balises asp (cela renvoi au code C# non?) Je suis donc limité à une seule balise par page?


Voilà, j'espère que vous pourrez m'éclairer, je suis un peu perdu là. :/