2010-07-02 20 views
9

Czy można pisać metody rozszerzania wyrażeń za polami RDLC?Metody rozszerzania wyrażeń RDLC

Na przykład, powiedzmy, że mam pole DateTime w moim źródle danych, które może mieć poprawną wartość lub może być puste. Przeciągam i upuszczam TextBox na mój RDLC i formatuję jego wartość za pomocą metody ToShortDateString(). Działa to dobrze dla zapełnionej wartości DateTime, ale oczywiście spowoduje to również wyjątek w czasie wykonywania, jeśli spróbuję wykonać .ToShortDateString() w polu NULL.

Zastanawiam się, czy mógłbym napisać metodę rozszerzenia, której mógłbym używać w moich wyrażeniach RDLC, więc gdy mam do czynienia z wartościami DateTime, mógłbym wywołać metodę taką jak .ConvertFromNullToEmptyString().

Oczywiście istnieją inne sposoby obejścia tego problemu, ale zastanawiałem się, czy metody rozszerzeń do użycia w wyrażeniach RDLC byłyby możliwym podejściem do mojego problemu biznesowego.

Dzięki ludziom!

+1

+1: Dobre pytanie. Wierzę, że tak, ale nigdy nie miałem czasu, aby dowiedzieć się. Mam nadzieję, że ktoś odpowie! – AMissico

+0

Zgaduję, że to po prostu niemożliwe; szkoda - oczekiwałem, że nagrodzę nagrodę opartą na rozstrzygającej odpowiedzi tutaj. – DanP

+0

używasz ssrs lub kontrolki przeglądarki raportów asp.net. Pytam, ponieważ plik RDL jest plikiem języka definicji raportu ssrs, a RDLC jest plikiem językowym definicji raportu, który jest używany przez asp.net do wyświetlania raportu, sans ss – CodeMonkey1313

Odpowiedz

2

Tak, jest to możliwe. Możesz albo embed code directly w raporcie lub dołączyć custom assembly.

+0

To nie są przykłady użycia metod rozszerzeń - o to pyta ... – DanP

+0

@DanP: podczas gdy to nie dodaje metod rozszerzenia, wywoływanie kodu jest wykonywane w taki sam sposób, jak normalne wyrażenia. – CodeMonkey1313

0

Chociaż zgadzam się z Coriną w sprawie rozwiązania tego problemu, wierzę, że lepsze rozwiązanie można osiągnąć bez przechodzenia przez sugerowaną trasę, używając wbudowanych wyrażeń. W każdym przypadku, gdy masz DateTime pochodzący z SQL, masz rację, może to być wartość null, jednak możesz to łatwo przetestować za pomocą instrukcji IIF (pamiętaj, że wyrażenia są w zasadzie w VB), aby sprawdzić null/nothing/empty i tak długo, jak to jest coś, uruchom żądaną operację, w przeciwnym razie zwróć puste. Tylko uważaj, ponieważ wynikowy typ IIF będzie prawdopodobnie ciągiem.

+1

Podczas gdy ja nie mogę spyware do OP lub AMissico; Jestem osobiście zainteresowany metodami rozszerzenia. Jest już dobrze znany sposób użycia dowolnego kodu niestandardowego w raporcie - więc odpowiedzi w tych wierszach są nieco bezsensowne ... – DanP

+0

Jednym z wyzwań, o które prosisz, jest to, że prawdopodobnie używasz refleksji do wykonania tej metody, więc jeśli wywołasz metodę .ConvertFromNullToEmptyString() na obiekcie zerowym (zerowa wartość datetime), otrzymasz wyjątek odwołania o zerowej wartości, chyba że przepisałeś DateTime? obiekt ma statyczną metodę o nazwie ConvertFromNullToEmptyString, która zapewnia wymaganą funkcjonalność.W tej chwili nie widzę, w jaki sposób ta konkretna funkcja przynosi więcej korzyści niż jakiś niestandardowy kod. – CodeMonkey1313

2

Możliwe jest stosowanie metod rozszerzenia, ale nie metod rozszerzania AS dla instancji obiektu. Musiałbyś je nazwać statycznym wywołaniem metody na typie, którego jest członkiem. Więc zamiast myDictionary.Values.Sum() - wywołanie metody Sum na własność słowniku przykład Values - można użyć System.Linq.Enumerable.Sum(myDictionary.Values) - przekazując instancję do statycznej Sum metody typu Enumerable (w tym przykładzie, raport musi odwoływać zespół System.Core). Więc tak, możesz użyć metod, które są również rozszerzeniami, ale (i tak się wydaje) nie jako rozszerzenia dla konkretnej instancji.