2011-03-30 2 views
1

ReportDataSource로 취한 rdlc 보고서는 List<BaseClass>입니다. BaseClass에는 두 개의 파생 클래스 AB이 있습니다.
보고서에서 나는 기본 클래스의 속성에 따라 그룹화합니다. 목록에 A 또는 B의 개체 만 포함되어 있으면 정상적으로 작동합니다.ReportViewer 2010은 다형성에 어려움을 겪고 있습니다

그룹에 사용되는 그룹 식 '[그룹 이름]'참조하는 오류를 포함하는 데이터 집합 필드 : FieldValueException

내가 AB에서 인스턴스를 혼합 그러나 경우, 보고서 작성은 다음과 같은 메시지와 함께 실패

이 속성은 두 클래스 모두에 대해 클래스 상수를 사용하는 간단한 문자열 리터럴을 반환하지만이 경우 잘못 될 수있는 것은 없습니다. 또한 다른 모든 사용 된 속성을 확인했지만 아무 문제가 없습니다.
이 동작을 본 사람이 있습니까? 아니면이 동작에 대해 다른 사람이 있습니까? 보고서 뷰어가 다형성을 좋아하지 않는다고 생각합니다! 그럴 수 있니?

public abstract class BaseClass{ 
    public abstract string GroupKey{get;} 
} 
public class A : BaseClass{ 
    public override string GroupKey{ 
     get{ 
      return ... 
     } 
    } 
} 
public class B : BaseClass{ 
    public override string GroupKey{ 
     get{ 
      return ... 
     } 
    } 
} 

답변

3

그것은이 보고서 뷰어의 또 다른 limitation 것으로 밝혀졌다. 솔루션으로 나는 BaseClass에서 파생되고 BaseClass의 인스턴스를 wrapps하는 클래스 C을 만들었습니다.
보고서 뷰어의 데이터 소스로 내 List<BaseClass>을 제공하기 전에 A와 B의 모든 포함 된 인스턴스를 C의 인스턴스로 래핑하고 C의 목록을 보고서 뷰어에 제공합니다. 따라서 모든 인스턴스는 동일한 유형이며 보고서 뷰어는 만족합니다.

예입니다. 나는이 같은 상황에서 누군가가 도움이되기를 바랍니다 :

public abstract class BaseClass{ 
    public string GroupKey{get;} 
    public virtual C GetWorkaroundWrapper(){ 
     return new C(this); 
    } 
} 
public class A : BaseClass{ 
    public override string GroupKey{ 
     get{ 
      return ... 
      } 
    } 
} 
public class B : BaseClass{ 
    public override string GroupKey{ 
     get{ 
      return ... 
      } 
    } 
} 
public class C : BaseClass{ 
    BaseClass m_baseClass; 
    public C(BaseClass baseClass){ 
     if(null == baseClass){ 
      throw new ArgumentNullException("baseClass"); 
     } 
     m_baseClass=baseClass; 
    } 
    public override string GroupKey{ 
     get{ 
      return m_baseCLass.GroupKey; 
     } 
    } 
    public override C GetWorkaroundWrapper(){ 
     return this; 
    } 
} 

GetWorkaroundWrapper -Methodis 단지 편의상. 이와 함께, 래퍼의 생성을 단순화 :

List<C> workaroundList=new List<C>(); 
foreach(BaseClass item in sourceList){ 
workaroundList.Add(item.GetWorkaroundWrapper()); 
} 

dataSource.Value=workaroundList; 

이 목록 C의 것을 중요하지 않다 있습니다. BaseClass의 목록에서도 작동하지만 C 목록을 사용하면 더 깨끗합니다.

관련 문제