2009-07-15 8 views
33

아래에 나열된 것과 유사한 객체 맵이 있습니다.GridView가 중첩 클래스의 속성으로 바인딩되었습니다.

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

의 GridView가 ObjectDataSource를 바인딩하고 ObjectDataSource를가 BoundClass의 완전히 채워진 인스턴스에 바인딩 : 나는의 GridView에 NestedClass의 속성을 결합 할 때 나는 오류가 발생합니다.

이 문제가 발생합니까?

샘플 클래스 : 인스턴스의

public class BoundClass 
{ 
    public string Name { get; set; } 
    public NestedClass NestedClass { get; set; } 
} 

public class NestedClass 
{ 
    public string Name { get; set; } 
} 
+0

열 이름 'NestedClass.Name'은 (는) 검색하는 데이터에서 존재하지 않습니다. – waqasahmed

답변

52

만 즉시 속성은 BoundField 열에 표시 할 수 있습니다.

대신 바인딩 된 필드에 할당하는 대신 중첩 된 속성에 액세스하려면 itemtemplate에서 DataBinder.Eval을 사용해야합니다.

예 :

http://web.archive.org/web/20120121123301/http://iridescence.no/post/FixingBoundFieldSupportforCompositeObjects.aspx

+8

끊어진 링크가있는 웨이 백 컴퓨터 : http://web.archive.org/web/20120121123301/http://iridescence.no/post/FixingBoundFieldSupportforCompositeObjects.aspx – user423430

10

이를 : 또는

<asp:TemplateField> 
    <itemtemplate> 
     <p><%#DataBinder.Eval(Container.DataItem, "NestedClass.Name")%></p> 
    </itemtemplate> 
</asp:TemplateField> 

, 당신은 BoundField을 상속이 블로그 게시물에 설명 된대로 DataBinder.Eval을 사용하는 GetValue를 재정의하는 사용자 정의 클래스를 만들 수 있습니다 BoundField의 확장은 중첩 된 속성을 지원하는 을 호출합니다.

public class BetterBoundField : BoundField 
{ 
    protected override object GetValue(Control controlContainer) 
    { 
     if (DataField.Contains(".")) 
     { 
      var component = DataBinder.GetDataItem(controlContainer); 
      return DataBinder.Eval(component, DataField); 
     } 
     return base.GetValue(controlContainer); 
    } 
} 
+0

+1 확장 메서드 – mcfea

관련 문제