2010-11-11 12 views
14

Je cherche à charger un GridView avec une liste générique et à générer les colonnes automatiquement. J'obtiens une exception qu'il n'a pas les propriétés correctes pour lui permettre de générer automatiquement les colonnes.Gridview utilisant une liste générique en tant que colonnes DataSource et auto-génération

Exception

The data source for GridView with id 'GV1' did not have any properties or attributes from which to generate columns. Ensure that your data source has content. 

GridView

<asp:GridView ID="GV1" runat="server" AutoGenerateColumns="true"></asp:GridView> 

chargement de la page

//LINQ query to populate list 
    List<student> su = new List<student>(); 
    dbDataContext db = new dbDataContext(); 
    var q = from c in db.data_table 
      where c.processed == false 
      orderby c.date_complete descending 
      select c; 
    //iterate through results and add to list 
    foreach(var c in q) 
    { 
     student s = new student { name = c.name, address = c.address }; 
     su.Add(s); 
    } 

    //Load GridView 
    GV1.DataSource = su; 
    GV1.DataBind(); //Exception thrown here 

Classe étudiant

public class student 
{ 
    public string name; 
    public string address; 
} 

Toutes les pensées ou suggestions sont appréciés, ne hésitez pas à me faire savoir si je vais sur ce complètement faux.

Répondre

21

Essayez de régler votre classe student et modifier vos champs en propriétés comme ceci:

public class student 
{ 
    public string name { get; set; } 
    public string address { get; set; } 
} 
+0

une réponse à une question similaire que j'avais. Ce que je ne comprends pas c'est pourquoi ça marche. Pourquoi est-ce que je peux accéder à 'student.name' manuellement mais' GridView' ne peut pas le faire à moins que j'ajoute les accesseurs? – Brendan

+3

Je ne peux pas dire spécifiquement, je peux seulement vous dire que la grille n'aura accès qu'aux propriétés et non aux champs. Je peux * deviner * que lorsqu'elle fait la réflexion, elle reflète sur les propriétés publiques ('BindingFlags.GetProperty') et non sur les champs publics (' BindingFlags.GetField'). – CodingGorilla