2010-07-02 65 views
9

是否可以在RDLC字段後面寫表達式的擴展方法?RDLC表達式擴展方法

例如,假設我的數據源中有一個DateTime字段,可能有一個有效值或可能爲空。我將一個TextBox拖放到我的RDLC上,並使用ToShortDateString()方法格式化它的值。這適用於填充的DateTime值,但是,如果我嘗試在NULL字段上執行.ToShortDateString(),那麼這顯然會在運行時引發異常。

我想知道是否可以編寫一個擴展方法,可以在我的RDLC表達式中使用,以便在處理DateTime值時,可以調用像.ConvertFromNullToEmptyString()這樣的方法。

當然還有其他方法可以解決這個問題,但我想知道RDLC表達式中使用的擴展方法是否會成爲解決我的業務問題的一種可能方法。

謝謝大家!

+1

+1:好問題。我相信如此,但從來沒有時間弄清楚。我希望有人回答! – AMissico

+0

我猜這根本不可能;太糟糕了 - 我期待根據這裏的決定性答案獎勵賞金。 – DanP

+0

是否使用了ssrs或asp.net報告查看器控件。我問,因爲一個RDL文件是一個ssrs報告定義語言文件,而RDLC是一個報告定義客戶端語言文件,asp.net用它來顯示報告,sans ssr – CodeMonkey1313

回答

2

是的,這是可能的。您可以在報告中輸入embed code directly或包含custom assembly

+0

這些不是使用擴展方法的例子 - 這就是問題所在...... – DanP

+0

@DanP:雖然這不會添加擴展方法,但調用代碼的方式與正常表達式相同。 – CodeMonkey1313

0

儘管我同意Corina解決問題的方法,但我相信如果不使用她建議的路線,可以使用內置表達式來達到更好的解決方案。在任何情況下,如果您有來自SQL的DateTime,那麼您是正確的,但它可以爲空,但是,您可以使用IIF語句(請記住表達式基本上在VB中)輕鬆地進行測試,以檢查null/nothing/empty並且只要是某種情況,請運行所需的操作,否則返回空白。請小心,因爲IIF的結果類型可能是字符串。

+1

雖然我不能爲OP或AMissico散播;我個人對擴展方法特別感興趣。在報告中如何使用任意自定義代碼已經非常有名 - 所以回答這些問題有點毫無意義...... – DanP

+0

您所要求的挑戰之一是反射可能被用於執行方法,所以如果你在空對象(空日期時間)上調用.ConvertFromNullToEmptyString(),你會得到一個空引用異常,除非你重寫了DateTime?對象有一個名爲ConvertFromNullToEmptyString的靜態方法,它可以提供您要求的功能。目前,我沒有看到這個特定的功能如何使您受益超過一些自定義代碼。 – CodeMonkey1313

2

可以在對象的實例上使用擴展方法,但不能使用AS擴展方法。您必須將它們作爲其所屬類型的靜態方法調用來調用它們。因此,代替myDictionary.Values.Sum() - 在字典實例的Values屬性上調用Sum方法 - 您可以使用System.Linq.Enumerable.Sum(myDictionary.Values)-將實例傳遞給Enumerable類型的靜態Sum方法(在本例中,報告必須引用System.Core程序集)。所以是的,你可以使用也是擴展的方法,但是(它總是出現)而不是作爲特定實例的擴展。