2012-06-07 46 views
1

我想使用匿名類型作爲GridView的源。但它將首先使用下拉列表進行過濾。讓我來解釋一下:我有我定義爲一個類型如下:在GridView中使用匿名類型

IEnumerable<object> data = new[]{ 
    new{Name="McClure Wallace", Id=1, Sal=10000d, Age=29}, 
    new{Name="John Jones", Id=2, Sal=12000d, Age=27}, 
    new{Name="Gloria Flowhart", Id=3,Sal=14000d, Age=21} 
      . . . 
    }; 

我用這個作爲源的下拉列表:當用戶從列表中選擇一個項目

ddlEmployee.DataSource=data; 
    ddlEmployee.DataTextField = "Name"; 
    ddlEmployee.DataValueField = "Id"; 
    ddlEmployee.DataBind(); 

我想要得到的相應的對象,並在GridView綁定它:

var sel = ddlEmployee.SelectedItem.ToString(); 

    var selData = from d in data where **d.Id= sel** select d; 
    gvSearchResults.DataSource = selData; 
    gvSearchResults.DataBind(); 

但問題是,因爲我會得到d爲對象,灑在d.Id.錯誤

我該如何解決這個問題。請注意,我可能無法更改「數據」的定義,因爲這是在應用程序外部控制的。爲了清楚起見,我只是在這裏展示。

+0

[訪問C#匿名類型對象](http://stackoverflow.com/questions/713521/accessing-c-sharp-anonymous-type-objects) – nawfal

回答

3

你的問題是你正在使用Enumerable<object>。當你做你的LINQ查詢它會說,Id不是object

一部分試試這個

var data = new[]{ 
new{Name="McClure Wallace", Id=1, Sal=10000d, Age=29}, 
new{Name="John Jones", Id=2, Sal=12000d, Age=27}, 
new{Name="Gloria Flowhart", Id=3,Sal=14000d, Age=21} 
     . . . 
}; 

另外,我不知道是否d.Id= sel是你有什麼exaclty(除*) 。如果是這樣的話,你需要改變一些事情

1)selstring,所以你需要將其轉換爲int

2)你需要使用==比較

+0

完美!正是我在找什麼! –

+0

我還有一個與此相關的問題:我可以通過並檢索通過會話對象的「數據」嗎?我應該用什麼來鑄造? –

+0

@Rupesh Saini:這有點複雜,並不是很推薦,這種情況下首選定義類型。你可以用一個叫做「按照例子轉換」的東西來做到這一點。看到這個相關的問題http://stackoverflow.com/questions/1409734/cast-to-anonymous-type –

1

您可以使用「動態」數據類型,所以像這樣的工作:

 dynamic data = new[]{ 
      new{Name="McClure Wallace", Id=1, Sal=10000d, Age=29}, 
      new{Name="John Jones", Id=2, Sal=12000d, Age=27}, 
      new{Name="Gloria Flowhart", Id=3,Sal=14000d, Age=21} 
     }; 

     Console.WriteLine(data[0].Name); 
請問

這個幫助你嗎?

+0

可能與jadarnel27相同。與3.5:( –

+0

@RupeshSaini,儘快升級,你錯過了花哨的東西:) 4。5幾乎在這裏;) – walther

1

首先,要selSelectedValue,而不是SelectedItem(以便您獲得id屬性爲您的where子句)。你也希望它是一個int,讓您可以在LINQ查詢比較它id

int sel = int.Parse(ddlEmployee.SelectedValue); 

接下來,你可以設置你IEnumerabledynamic類型的對象,避免你提到的編譯器錯誤:

IEnumerable<dynamic> data = new[]{ 
            new{Name="McClure Wallace", Id=1, Sal=10000d, Age=29}, 
            new{Name="John Jones", Id=2, Sal=12000d, Age=27}, 
            new{Name="Gloria Flowhart", Id=3,Sal=14000d, Age=21} 
           }; 

最後(as Caludio said),你想使用==運營商在你的LINQ查詢:

var selData = from d in data where d.Id == sel select d; 

此時,您的DataBind()應該沒有問題地運行。

+0

感謝您的建議。不幸的是,我很驚訝3.5,所以我不能嘗試你的解決方案,但我相信它的工作原理如此+1你 –

+0

@RupeshSaini啊,我總是忘記'dynamic'是一個4.0的功能。祝你好運,我很高興你能得到一些幫助! – jadarnel27