9

是否可以为 RDLC 字段后面的表达式编写扩展方法?

例如,假设我的数据源中有一个 DateTime 字段,该字段可能具有有效值或可能为空。我将一个 TextBox 拖放到我的 RDLC 上,并使用 ToShortDateString() 方法格式化它的值。这适用于填充的 DateTime 值,但是如果我尝试在 NULL 字段上执行 .ToShortDateString() ,这显然也会在运行时引发异常。

我想知道是否可以编写一个可以在我的 RDLC 表达式中使用的扩展方法,以便在处理 ?DateTime 值时,我可以调用像 .ConvertFromNullToEmptyString() 这样的方法。

当然还有其他方法可以解决这个问题,但我想知道在 RDLC 表达式中使用的扩展方法是否可以解决我的业务问题。

谢谢各位!

4

4 回答 4

2

可以在对象实例上使用扩展方法,但不能使用 AS 扩展方法。您必须将它们作为对其所属类型的静态方法调用进行调用。因此,您可以使用-- 将实例传递给该类型的静态方法(在此示例中,报表必须引用程序集) ,而不是myDictionary.Values.Sum()调用字典实例Sum的属性上的方法。所以是的,您可以使用也是扩展的方法,但(它无论如何都会出现)不是作为特定实例的扩展。ValuesSystem.Linq.Enumerable.Sum(myDictionary.Values)SumEnumerableSystem.Core

于 2012-02-29T17:45:02.680 回答
2

是的,这是可能的。您可以直接在报告中嵌入代码或包含自定义程序集

于 2010-09-19T08:19:35.173 回答
0

虽然我同意 Corina 对问题的解决方案,但我相信可以使用内置表达式在不走她建议的路线的情况下达成更好的解决方案。在任何情况下,如果您有来自 SQL 的 DateTime,您是正确的,它可以为空,但是,您可以使用语句轻松测试这一点(请记住,表达式基本上在 VB中IIF)来检查null//nothingempty只要是东西,运行所需的操作,否则返回空白。请小心,因为结果类型IIF可能是字符串。

于 2010-09-21T22:20:49.823 回答
0

例如,假设我的数据源中有一个 DateTime 字段,该字段可能具有有效值或可能为空。我将一个 TextBox 拖放到我的 RDLC 上,并使用 ToShortDateString() 方法格式化它的值。这适用于填充的 DateTime 值,但是如果我尝试在 NULL 字段上执行 .ToShortDateString() ,这显然也会在运行时引发异常。

在您的情况下,应该不需要自定义函数。只需使用 VB 的If()三元运算符

=If(Fields!MyDate.Value IsNot Nothing, Fields!MyDate.Value.ToShortDateString(), "N/A")

(就个人而言,我通过 AutoMapper 汇集我的对象,并让它null用默认值或对象替换值,这样我根本不必处理null报告中的值)。


应该提到的是,在大多数情况下,If(condition, true_part, false_part) 三元运算符应该(使用 one I)优于IIf(condition, true_part, false_part) 函数(使用 two )。I

三元运算符将If()仅对与条件结果相对应的部分进行短路评估(例如,True仅评估 的条件true_part)。

IIf()函数将始终评估条件和两个部分,因为它只是一个函数调用,并且函数的所有参数都将在调用之前进行评估。

于 2021-03-06T23:03:46.773 回答