2009-04-20 5 views
1

J'ai un GridView ce que je remplis à travers une expression LINQ.
Quelque chose comme ceci:Si je remplis un objet GridView avec des objets anonymes, comment puis-je obtenir leurs propriétés?

GridView1.DataSource = from c in customers, o in c.Orders, 
    total = o.Total where total >= 2000 select new {id = c.CustomerID, 
    order = o.OrderID, total = total}; 

Et dans sa RowCreated méthode J'essaie d'obtenir une propriété, par exemple l'identifiant, mais il n'a pas un type connu:

object element = e.Row.DataItem; 
int id = element.id; // It's bad!!!!!! 

Comment puis-je faire?
Merci!

Répondre

4

Nommez votre type!

public class GridType 
{ 
    public int Id {get; set:} . . etc 
} 

puis à LINQ,

. . . select new GridType {...etc} 

Ensuite, dans la méthode RowCreated, CAST DataItem à GridType, et vous pouvez CCESS ses propriétés.

Sinon, vous cherchez un type de canard que C# ne fait pas.

+0

C'est la bonne façon de rouler. –

2

Vous devez utiliser la réflexion.

Type t = element.GetType(); 
int id = 0; 

foreach (PropertyInfo p in t.GetProperties()) 
{ 
    // Not very nice but finds an integer property called "id" 
    if (p.PropertyType == typeof(int) && p.Name == "id") 
    { 
     id = (int)p.GetValue(element, null); 
    } 
} 

LINQ:

Type t = element.GetType(); 
int id = 0; 
var pt = new List<PropertyInfo>(); 
pt.AddRange(t.GetProperties()); 
id = (int)pt.Where(p => p.PropertyType == typeof(int) && p.Name == "id").First().GetValue(element, null); 

Je ne sais pas, il lit mieux que, d'autant plus que Type.GetProperties retourne un tableau qui doit être converti en une liste pour obtenir les méthodes Linq.

1

C'est le coût que vous devez payer si vous voulez utiliser des objets anonymes: vous perdez la frappe forte lorsque vous quittez la portée où votre objet est déclaré. Je vous recommande de déclarer explicitement votre type, sauf si vous voulez jouer avec DataBinder.Eval ...

Questions connexes