Edytowalny ListBox
Dużo czasu spędzam ostatnio przy mini projekcicku [więcej info wkrótce]. Potrzebowałem kontrolki listboxa ale z edytowalnymi polami. Jako że w .necie taka kontrolka nie jest dostępna standardowo to postanowiłem “wyciosać” własną. .Net daje nam spore pole do popisu jeżeli chodzi o tworzenie własnych “customowych” kontrolek.
By tego dokonać będziemy potrzebować dwóch nowych kontrolek.
- TextBoxa który będzie komunikował się z danymi ListBoxa
- ListBoxa wykorzystującego tego TextBoxa
Opis Działania.
ListBox normalnie wyświetli Itemy. W momencie wybrania któregoś pola w miejscu Itema wygeneruje odpowiednią kontrolkę TextBoxa. Po wprowadzeniu textu do TextBoxa będzie on znikał i tracił “focus” przesyłając zmiany do ListBoxa , [ skupienie :D jak to dziwnie brzmi ostatnio zauważyłem że niektóre wydawnictwa tłumaczą “singleton” jako “samotnik” ].
TextBox
Zaczniemy od TextBoxa bo zawiera on mniej modyfikacji.
Dziedziczymy po standardowum TextBoxie i definiujemy pole Index , które będzie zawierać numer naszego obiektu , itemu , w listBoxie.
Przeciążamy metodę wywoływaną w momencie wychodzenia z textBoxa tak by wszelkie wprowadzone zmiany zmieniały także obiekt w naszym ListBoxie do tego jest nam potrzebny parametr Index , który określa do którego konkretnie elementu się odnosimy.Odwołanie do ListBoxa realizujemy poprzez propercje Parent.
Na wszelki wypadek wywołujemy bazową metodę.
Można oczywiście zrobić inny mechanizm. Np akceptowanie zmian w momencie wciśnięcia odpowiegniego klawisza.
W tym przypadku Enter
ListBox
Przejdzmy teraz do ListBoxa. Tutaj już będzie troszeczkę więcej zmian.
Dziedziczymy po ListBoxie tworzymy propercje oznaczającą odstęp pomiędzy wyświetlanymi itemamy i tworzymy lokalna kopię naszego zmodyfikowanego TextBoxa
Tworzymy Text Boxa ustawiamy jego “rodzica” . Propercja Parent będzie nam służyła do komunikacji pomiędzy TextBoxem i ListBoxem.
Musimy przeciążyć metodę odrysowywującą. Na wszelki wypadek badamy index Obiektu w ListBoxie , wyznaczamy prostokąt na podstawie jego parametrów , uwzględniając MarginBeetwenItems. Rysujemy napis w odpowiednim miejscu.
Główna metoda tworząca [chociaż bardziej pasuje słowo modyfikująca] odpowiednio kontrolke TextBoxa , przy kliknięciu Lewym Przyciskiem myszki. Parametry TextBoxa modyfikujemy tak aby wyświetlał się w miejscu klikniętego obiektu na ListBoxie.
Odpowiednie funkcje powodujące zniknięcie naszego TextBoxa przy wyjściu z kontrolki i przy zmianie obiektu.