1

ReportDataSource として取る rdlc レポートがありますList<BaseClass>BaseClassには、 と の 2 つの派生クラスがAありBます。
レポートでは、基本クラスのプロパティに基づいてグループ化しています。Aリストにまたはのオブジェクトのみが含まれている限りB、すべて正常に機能します。ただし、 と のインスタンスを混在させるAB、レポートの作成が失敗し、次のメッセージが表示されます。

'[グループ名]' のグループ化で使用されるグループ式は、次のエラーを含むデータセット フィールドを参照しています: 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 ...
       }
    }
}
4

1 に答える 1

3

これは Report Viewerのもう 1 つの制限であることが判明しました。解決策として、のインスタンスCからも派生してラップするクラスを作成しました。 my を Report Viewer の DataSource として提供する前に、含まれている A と B のすべてのインスタンスを C のインスタンスでラップし、C のリストを Report Viewer に渡します。したがって、すべてのインスタンスは同じタイプであり、Report Viewer は満足しています。BaseClassBaseClass
List<BaseClass>

ここに例があります。これが同じ状況の誰かに役立つことを願っています:

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

于 2011-03-31T07:48:36.517 に答える