2011-03-30 9 views
1

ReportDataSourceにはList<BaseClass>というrdlcレポートがあります。 BaseClassは、2つの派生クラスABを持っています。
レポートでは、ベースクラスのプロパティに基づいてグループ化します。リストにはAまたはBのオブジェクトしか含まれていない限り、すべて正常に動作します。しかし、私はABからインスタンスを混ぜた場合、そのレポートの作成は、次のメッセージで失敗します。ReportViewer 2010はポリモーフィズムで苦労しています

のグループ化に使用されるグループの式「[グループ名]」の参照エラーが含まれているデータセットフィールド:FieldValueException

このプロパティは、両方のクラスに対して、クラスの定数を基にした単純な文字列リテラルを返します。これには何も問題はありません。私は他の使用されているプロパティもすべてチェックしましたが、何も問題はありません。
誰かがこの動作を見たことがありますか?レポートビューアでは多型が好きではないようです。それはできますか?

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を作成しました。
Report ViewerのDataSourceとしてList<BaseClass>を提供する前に、AとBのすべてのインスタンスをCのインスタンスにラップし、CのリストをReport Viewerに渡します。したがって、すべてのインスタンスは同じタイプであり、レポートビューアは満足しています。

ここに例を示します。

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のリストを使用するときれいです。

関連する問題