2009-04-20 3 views
1

私はGridViewを持っているので、LINQ式を使って埋めます。このような
何か:匿名オブジェクトでGridViewを塗りつぶした場合、どのようにプロパティを取得できますか?

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}; 

とそのに、私はプロパティを取得しようと方法、例えばIDをRowCreatedが、それは知られていないタイプがありますどのようにすることができ

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

を行う?
ありがとうございます!

答えて

4

名前をタイプしてください!

LINQで、その後
public class GridType 
{ 
    public int Id {get; set:} . . etc 
} 

、RowCreated方法で次に

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

は、GridTypeにデータ項目をキャスト、そしてあなたはそれがプロパティだCCESSことができます。

そうでなければ、C#ではできないアヒルのタイプをお探しです。

+0

これは正しい方法です。 –

2

あなたはリフレクションを使用する必要があります。 LINQのを使用して

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); 
    } 
} 

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); 

わからない、それはType.GetPropertiesは、LINQのメソッドで取得するためにリストに変換する必要がある配列を返し、特にとして、しかし任意のより良い読み込みます。

1

これは、匿名オブジェクトを使用する場合に支払う必要があるコストです。オブジェクトが宣言されているスコープから離れるときに強い入力が失われます。 DataBinder.Evalと遊びたい場合を除き、明示的にタイプを宣言することをお勧めします。

関連する問題