2012-02-14 4 views
6

나는 프로젝트에서 Sql 쿼리의 결과를 DataTable s로로드하고 있습니다.런타임에 사용자 지정 비즈니스 개체에 동적 바인딩

이러한 DataTableRepeater 웹 컨트롤에 바인딩하는 프런트 엔드로 전달됩니다.

위대한 작품입니다. 그러나 이제 우리는 DataTable 대신 사용자 정의 클래스에 바인딩하려고합니다. 불행히도, 내가 생각한 것은 확실한 대답이 작동하지 않았다는 것이 었습니다 (우리 클래스에 IDictionary<string, object> 구현).

모든 바인딩에 대해 구체적인 속성을 만들지 않고 Eval을 Datum에 바인딩해야 할 필요가 있습니까? 분명히 DataRow는 우리가 바인딩하는 모든 속성을 구체적으로 구현할 필요가 없습니다. 그래서 어떻게 든 Eval은 DataRow에서 이름으로 속성 값을 조회 할 수 있습니다. 여기

는 데이터 소스가

rptTags.DataSource = new[] { new Datum { {"Count", 1} }, new Datum { {"Count", 2 } }; 

을 파일 aspx.cs에서 설정

다음
public class Datum: IDictionary<string, object> 
{ 
    private Dictionary<string, object> _entries; 

    public Datum() 
    { 
     _entries = new Dictionary<string, object>(); 
    } 

    public object this[string s] 
    { 
     get 
     { 
      return this._entries[s]; 
     } 
    } 

    ... 
} 

는 사용자 정의 클래스입니다 그리고 여기에 영문 파일에 구속력

<asp:Repeater ID="rptTags" runat="server"> 
    <ItemTemplate> 
     <%# (int)Eval("Count") > 
    </ItemTemplate> 
</asp:Repeater> 

위 예제를 사용하면 문제의 속성이 존재하지 않는다는 오류가 발생하지만 이는 사실이지만 d DataRow에도 존재하지 않습니다. System.Data.DataRow와 같이 바인딩 할 수 있습니까?

+0

당신이 당신에게 데이터 모델 클래스와 평가 식을 공유 할 수있는 WebControl의 데이터 소스로 (3-5 단계에서 만든) 당신의 CustomTypeDescriptor 개체를 설정하고 그것에 바인딩 평가()를 사용 도움을 쉽게하십시오. –

+0

"이것은 무엇이든 시도하고 시험하는 것은 악몽이됩니다." 예를 들면? –

+0

@mark Okay 나는 그것을 얻은 것 같아 ... – Aristos

답변

1

나는 신선한 시각으로 오늘 아침에 왔고 ILSpy로 .Net Framework를 통과하는 데 몇 시간을 보냈다. 마침내이 퍼즐을 이해하고 작동 가능한 솔루션을 구현할 수있었습니다. 솔루션에 적절한 배운 것들을 나열하고 구현 방법을 자세히 설명합니다.

  • 당신은 내가 예상처럼 각 RepeaterItem는 DataRow를 결합하지 않는 리피터에 DataTable을 바인딩

    하지만을 DataRowView합니다. DataRowView가 우리 클래스에 구현해야 할 인터페이스 인 ICustomTypeDescriptor 인터페이스를 구현한다는 것을 제외하고는 실제로 중요하지 않습니다.
  • MSDN documentation에도 Eval 메서드가 리플렉션을 사용하여 후기 바인딩을 수행하고 표현식이 공용 속성으로 평가되어야한다고 말했지만 이는 단순히 사실이 아닙니다. Eval 문은 ICustomTypeDescriptor의 GetProperties() 메서드를 사용하여 식을 계산합니다.

DataTable처럼 동적으로 바인딩 할 수있는 고유 한 사용자 지정 형식을 만들기 위해 수행해야하는 단계가 있습니다.

  1. PropertyDescriptor에서 상속받은 사용자 지정 클래스를 만듭니다.
  2. PropertyDescriptor의 추상 멤버를 모두 구현합니다. 동적 바인딩의 경우 가장 중요한 것은 GetValue()입니다. 여기에서 바인딩하려는 클래스의 값을 가져 오는 방법을 정의합니다.
  3. 바인딩 할 클래스에서 CustomTypeDescriptor를 상속합니다. 이것은 ICustomTypeDescriptor를 구현하는 제네릭 클래스입니다.
  4. CustomTypeDescriptor의 GetProperties() 메서드를 재정의하고 바인딩 할 수있는 각 값에 대해 1-2 단계에서 만든 PropertyDescriptors 목록을 반환하십시오.
  5. PropertyDescriptions의 Name 속성이 설정되어 있는지 확인하십시오. 이 속성 .Net은 바인딩 할 때 사용할 PropertyDescription을 결정하기 위해 평가 식을 비교합니다.
  6. 그 것, 동적
0

바인딩 가능한 DataSource는 IEnumerable 또는 IListSource을 구현해야합니다.

동적 측면 : 데이터 바인딩의 마술 중 일부는 리플렉션을 사용하여 발생합니다.

+0

답해 주셔서 감사합니다. 예, MSDN 문서에서 후기 바인딩을 수행하기 위해 리플렉션을 사용하고 있습니다. 그러나 DataRow는 여전히 동적 인 데이터 바인딩 기능을 사용할 수 없으므로 필자도 그렇게 할 수 있어야한다고 생각합니다. –

관련 문제