2016-01-25 62 views
2

我有一個名爲dataGrid的數據網格的WPF項目。爲什麼一個lamba表達式與運算符工作,而不是其他

我正在做一些測試,看看lambda表達式和運算符是如何工作的。

這裏是我的表tUsers我擁有的數據:

enter image description here

而且我不明白爲什麼這樣的:

this.dataGrid.ItemsSource = (from em in context.tUsers 
          select new { em.name }).ToList(); 

這將工作,並顯示在正確的名稱數據網格。它看起來像這樣: enter image description here

但是,如果我在本教程不喜歡上.codeproject.com

this.dataGrid.ItemsSource = (from em in context.tUsers 
          select em.name).ToList(); 

這將只是顯示一些整數,而不是名字。我不知道爲什麼。 enter image description here

所以我想第一個將創建一個匿名對象,並把em.name裏面。但我不明白一個人會工作,而不是另一個。

我特別感興趣的是它爲什麼顯示這些整數。

無論如何解釋?

PS:我只注意到整數實際上是字符串的長度。我不知道爲什麼。

+0

沒有使用WPF,但我會想象源是尋找一個屬性'name'的對象,如果沒有找到,默認是別的東西(可能是索引?)。無論如何,你所擁有的陳述彼此非常不同。 – Rob

回答

1

網格顯示了您傳遞給它的可枚舉類型的每個非索引器屬性的列。

在第一種情況下,您傳遞一個匿名類型的列表,它具有一個name屬性,它是一個字符串,因此它顯示一個名爲name的列,並顯示這些字符串。

在第二種情況下,您傳遞字符串列表,而字符串只有一個Length屬性,因此它會創建一個名爲Length的列,並顯示這些長度。

0
this.dataGrid.ItemsSource = (from em in context.tUsers 
         select em.name).ToList(); 

這將返回一個字符串列表,而另一個將選擇一個匿名類型列表,並帶有name屬性。

它顯示每個字符串的長度,爲什麼它默認爲這種行爲,我不知道。

1

你混合2個語法:

this.dataGrid.ItemsSource = (from em in context.tUsers 
         select new { em.name }).ToList(); 

它將創建的字符串列表(即你正在尋找的名稱)

而且這樣的:

this.dataGrid.ItemsSource = (from em in context.tUsers 
         select em).ToList(); 

它將創建您的對象「員工」列表。

編輯: 默認情況下,DataGrid會自動從給定的item類中生成列,所以它會在String類中搜索它可以轉換爲列的屬性。所以在這裏,它顯示了string.Length。 因此,您需要創建自己的列並關閉AutoGenerateColumns。示例:

<DataGrid Name="MainGrid" ... AutoGenerateColumns="False" ItemsSource="{Binding}"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="name" Binding="{Binding}"/> 
    </DataGrid.Columns> 
</DataGrid> 
+0

尋找投影算子。 – dyesdyes

+0

請檢查我的編輯。 –

相關問題