Krótki wstęp, MSChart jest biblioteką do generowania diagramów zarówno w aplikacjach ASP.NET jak i Windows Forms. Tutaj znajdziecie maaaasę przkładów jak można wykorzystać kontrolki i co za pomocą nich można zrobić. Ja nie bawiłem się kontrolkami dla Windows Forms – nawet nie wiem czy się różnią od kontrolek dla ASP.NET. Post dotyczy stricte wykorzystania MSCharts w ASP.NET.
Podczas dynamicznego generowania diagramów z wykorzystaniem MSChart (blog) natknąłem się na trochę beznadziejny problem:
Nie licząc iż miejsce wystąpienia błędu było niepoprawne – źle wskazane, to jeszcze opis błędu niewiele mi mówił – coś gdzieś poszło źle, czegoś brakuje, coś zostało źle podane, biblioteka nie działa. Można wymieniać i wymieniać przyczyny takiego błędu.
Na szęście stacktrace trochę ograniczył moje poszukiwania, problem występował wyraźnie przy redneringu tytułu, czyli coś musiało być nie tak. Po sprawdzeniu paru własności wiedziałem co dokładnie jest nie tak:
To co mnie zdziwiło to czemu dopiero dostałem wyjątek w trakcie renederowania a nie w trakcie inicjalizacji tytułu diagramu w kodzie. Dla mnie biblioteka zewnętrzna zawsze stanowi całość, która powinna określać kontrakt pomiędzy wywołującym a nią. To znaczy, biblioteka nie powinna zezwolić wywołującemu na wykonanie operacji, która spowoduje, iż kod w bibliotece nie zadziała. Jest to złe podejście do projektowania bibliotek. Do tego jeszcze MSChart nie informuje w jakimkolwiek sposób, iż konstruktor przyjmuje jedynie wartości not null, jak i nie informuje, iż może wystąpić jakiś problem.
Wykonałem więc głupi test:
I mi szczęka odpadła. Z niego wynika, że nie mogę podać null w konstruktorze od tytułu, ale mogę podać null kiedy przypisuje wartość Text tytułu – gdyż w tym momencie biblioteka zastąpi mój null string.Empty, jest to jakaś maksymalna nieścisłość!
Zajrzałem więc do biblioteki za pomocą .NET Reflectora by potwierdzić swoje przypuszczenia:
Sorki, ale jeżeli ktoś już tworzy bibliotekę i zezwala na przypisanie wartości null do property, to IMO powinien zezwolić na to samo w konstruktorze. A jeżeli nie zezwala – to powinien zwrócić wyjątek ArgumentNullException zarówno w momencie tworzenia obiektu jak I przypisania wartości Text, a nie raz pozwalać raz nie, tutaj się nie da to spróbuj od drugiej strony, tutaj pogłaszcz, tam przytul a tam daj klapsa (sic!). Szkoda bo biblioteka wydawała się fajna dla ASP.NET, ale nie licząc tego małego przypadku to jeszcze kilka dodatkowych ekstra konfiguracyjnych problemów wystąpiło i szczerze mówiąc nie chce mi się z nią już współpracować na stronach webowych. Na pewno są lepsze rozwiązania.
Oczywiście workaround dla tego błędu to:
Lub weryfikacja parametru, lub utworzenie Title bez podawania jego tekstu :)
I tak niektórzy powiedzą, iż ja powinienem się upewnić, że parametr nie jest null kiedy go przekazuje do konstruktora – pewnie i powinienem gdybym wiedział, że muszę. Więc jak tworzycie jakiekolwiek biblioteki pamiętajcie o kontraktach! Bo łatwo jest zniechęcić użytkownika :)
Cześć, napisałeś, że są lepsze rozwiązania niż msCharts. Masz może coś darmowego do polecenia do zastosowań w Asp.net?
jqPlot – darmo bardzo przyjemnie się z tego korzysta i moim zdaniem wizualnie lepiej wygladajace niż MSChart. Do tego bardziej interaktywne
http://www.jqplot.com/
Maja niestety jednen malutki blad z banalnym workaroundem (dodajc dosłownie 11 znakow width=”300”) dla dynamicznie generowanchych Chartow na divach dodanych za pomocą jQuery na IE i na IIS7 (wszystkie parametry musza być true by problem zaistniał) :) ale o tym będzie w przyszlym tygodniu krotki post
Popatrz sobie na dema, naprawdę dużo rzeczy można zrobić za pomocą ich.
Do tego sa jeszcze inne charty oparte na jQuery na przykład:
http://www.1stwebdesigner.com/resources/top-jquery-chart-libraries-interactive-charts/
mi się z jqPlot jak na razie dobrze pracuje, wiec zachęcam do spróbowania :)
Comments are closed.