2009-01-12 17 views
2

我有綁定到一個ICollection<UserAnswer>需要顯示兩列的GridView控件:在沒有自定義類型的情況下顯示綁定字段的連接值?

<asp:GridView ID="UserAnswersGridView" runat="server"> 
    <Columns> 
     <asp:BoundField DataField="Question.Name" HeaderText="Question Name" SortExpression="QuestionID" /> 
     <asp:BoundField DataField="Score" HeaderText="Score" SortExpression="Score" /> 
    </Columns> 
</asp:GridView> 

但我得到的錯誤:

A field or property with the name 'Question.Name' was not found on the selected data source.

每個UserAnswer有一個QuestionId值是什麼,我會用查詢問題名稱。在代碼中,我只需要調用userAssessment.Question.Name,但是如何在GridView中綁定列而不創建新類型?

供參考,這是返回的數據的方法:

public static ICollection<UserAnswer> GetUserAnswers(Int32 userAssessmentId) 
{ 
    DataContext database = new DataContext(GetConnectionString()); 
    return database.UserAnswers.Where(u => u.UserAssessmentId == userAssessmentId).ToList(); 
} 

很抱歉,如果這個解釋是不是很清楚!

回答

2

我認爲GridView只支持直接類型的屬性。中繼器還是類似的選項?這給你更多的靈活性。

或者,您可以通過局部類添加墊片屬性類型:

namespace YourLinqNamespace { 
    partial class UserAnswer { 
     public string QuestionName {get {return Question.Name;}} 
    } 
} 

您無法在過濾器(Where等)使用,但你應該能夠使用它返回的對象沒有問題。請注意,您可能需要使用LoadWith保存往返:

DataLoadOptions options = new DataLoadOptions(); 
options.LoadWith<UserAnswer>(x=>x.Question); 
database.LoadOptions = options; 
+0

我從來沒有聽說過「中間財產」 - 一個很好的 – 2009-01-12 16:14:54

+0

墊片,直通,挑選你自己的術語 - 我擲骰子;-p – 2009-01-12 16:18:46

1

您也可以使用ItemDataBoundEvent設置字段後面的代碼。或者你可以使用匿名類型,就像Marc的shim屬性概念一樣,但是你不會修改你的域模型。

from u in database.UserAnswers 
Where u.UserAssessmentId == userAssessmentId 
select new { QuestionName=u.Question.Name, 
       Answer = u.Answer 
       //etc etc 
      }; 

正如馬克指出,你不應該從方法返回一個匿名類型,我用招時手動綁定到數據源,以便:

myGrid.DataSource =從u等。 ..

在我看來,使用我的第一個建議是更好的,並處理它在項目數據綁定事件。

1

像Marc Gravell一樣,我幾乎總是會爲這些情況創建墊片屬性。另一種選擇是使用模板列,而不是綁定列,但它實際上取決於您的情況:

<asp:TemplateField HeaderText="Question Name"> 
    <ItemTemplate> 
    <%# Eval("Question.Name") %> 
    </ItemTemplate> 
</asp:TemplateField> 
相關問題