1

我有一个 rdlc 报告,它作为 ReportDataSource a List<BaseClass>BaseClass有两个派生类AB.
在报告中,我根据基类的属性进行分组。只要列表只包含Aor的对象B,一切正常。A但是,如果我从和混合实例B,则报告创建失败并显示以下消息:

分组“[组名称]”中使用的组表达式引用了包含错误的数据集字段: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 的另一个限制。作为一种解决方案,我创建了一个类,该类C也派生自BaseClass并包装了BaseClass.
在提供 myList<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;
    }
}

-MethodGetWorkaroundWrapper只是为了方便。这样,包装器的创建就被简化了:

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 回答