2009-02-23 10 views
7

TłoJak uniknąć Windows Forms .Value pojemnik Automatyczne grupowanie

W .NET Windows Forms (2.0) przyciski radiowe są automatycznie grupowane według ich kontroli pojemnika, czy jest to forma, Panel lub groupbox.

Oznacza to, że po wybraniu jednego przycisku, każdy inny przycisk w tym samym pojemniku zostanie automatycznie zmieniony na niezaznaczony.

Teraz rozważmy następujący układ formularza:

MUST HAVE NICE TO HAVE DESCRIPTION 
--------- ------------ ----------------------------------------------- 
    [ ]   [ ]  The gizmo works 
    [ ]   [ ]  The gizmo works beautifully 
    [ ]   [ ]  The gizmo works amazingly and makes you breakfast 
    [ ]   [ ]  The gizmo comes with a pony 
  • Każdy '[ ]' jest przycisk radiowy.
  • Użytkownik jest proszony o wybranie wymagane odpowiedź w kolumnie pierwszej, a opcjonalnie (pożądane, najlepiej przypadek odpowiedź) w kolumnie 2.

Jak widać, przyciski radiowe należy być pogrupowane według kolumn: wybór jednego z radiów powinien usunąć resztę kolumny, ale nie powinien mieć wpływu w drugiej kolumnie.

Problem

Zasadniczo problemem jest to, że jest to forma generowane dynamicznie.

  • Liczba wierszy w układzie jest dynamiczna i jest ładowana z konfigurowalnej definicji formularza.
  • Tekst opisu nie jest znany aż do czasu wykonania, a długości różnią się znacznie (niektóre mogą zawierać tylko kilka słów, a kilka innych kilkanaście linii).
  • Układu nie można przeprojektować. Wynika to ze znajomości (nietechnicznych) użytkowników papierową wersją tego formularza, który był używany od lat. Ten formularz zostanie również wydrukowany, a nawet jeśli zmienię system wejściowy w mojej formie, co oznaczałoby zakodowanie kolejnej wersji do drukowania ze "starym" układem.

Co próbowałem i nie działa

raz pierwszy starał się wdrożyć to jak układ generowanych dynamicznie przy użyciu trzech paneli, po jednym dla każdej kolumny, a więc automatyczne grupowanie przycisk radiowy będzie działać tylko w porządku. I tak się stało.

Ale problemy z układem związane z poziomym wyrównaniem między przyciskami radiowymi i tekstem po prostu mnie zabijają. Rozmiar tekstu nie jest znany do czasu wykonania, a linie tekstu mogą się zawijać (czasami kilka razy dla każdego elementu). Czasami wyrównuje się prawidłowo, czasami nie. Mam zamiar rozpocząć debugowanie tego, ale myślę, że może zmiana tej trójpłatowej implementacji jest lepszą opcją.

Co usiłuję zrobić

chciałbym przeprojektować układ używając do TableLayoutPanel z trzema kolumnami w celu uproszczenia kwestii wyrównania podobne, ale to oznacza, że ​​nie mogę używać automatycznej radia przycisk "grupowanie według kontenera".

EDIT:

Jak sugeruje Gerrie, inna opcja układ ma mieć każdego wiersza wdrażane jako formantu użytkownika i używać panelu układ przepływu.

To oznacza, że ​​mogę chcieć użyć elementów sterujących dla układu, ale nie dla grup przycisków radiowych.

musiałbym dostać grup przycisk radiowy pionowe pomimo przy użyciu poziomego użytkownik kontroluje

/EDIT

Co próbuję zapytać

muszę wskazówki i sugestie o tym, jak aby ręcznie sterować grupowaniem przycisków radiowych. Naprawdę nie mam nic przeciwko podklasowaniu klasy RadioButton w razie potrzeby.

Czy istnieje jakiś "kanoniczny" lub znany sposób podklasy "RadioButton" lub przejścia od razu do API Win32, tak aby za każdym razem, gdy kontrola była sprawdzana (za pomocą myszy, klawiatury Enter, spacji, oraz w inny sposób, o którym nie wiedziałbym, że je wybiorę) Mogę przechwycić zdarzenie i ręcznie zaktualizować stan każdej innej kontroli w moim formularzu oraz w sposób, w jaki funkcja automatycznego grupowania jest znana jako "dezaktywowana". ? Obawiam się, że implementacja jest również powiązana z pojemnikiem, a ja mogę również zostać zmuszony do podklasy Panel ?.

Jak działa grupowanie "magii" w Windows Forms?

Każde rozwiązanie, które znalazłem w serwisie Google, które implementuje niestandardowe grupy przycisków radiowych lub "listy przycisków radiowych", opiera się w pewien sposób na użyciu kontenera dla grupy. Czy można unikać pojemników? Jeśli tak to jak?.

Odpowiedz

6

czasowy rozwiązanie (czytaj: niechlujny siekać) znalazłem jest to, że Kładę każdy i każdą opcję w swoim własnym małym panelu. Więc żadna z nich nie ma żadnego zgrupowania. Słucham każdego zdarzenia i aktualizuję odpowiednie.

Nadal uważam, że przesadne jest posiadanie tak wielu paneli, a jeśli ktoś ma czystsze rozwiązanie, chciałbym to usłyszeć.

(OK, przepraszam za odpowiedzi na moje własne pytanie. Wiesz, że gdy trochę czasu, aby wyjaśnić coś zaczniesz widzieć problemu go innym świetle.)

+0

Jeśli idziesz z tym rozwiązaniem, to nadszedłby dobry czas, aby stworzyć własny radiobutton, który nie musi być w panelu. A kiedy już to zrobisz, dodaj opcjonalną właściwość GroupID, która jest wysyłana z powrotem po przełączeniu. – Stefan

+0

Jeszcze raz dziękuję za pomoc Stefana. Przy okazji, stworzyłem już klasę IndependentRadioButton, ale nie przyszło mi jeszcze do głowy, aby dodać właściwość GroupId właśnie tam. Brzmi po prostu w porządku. –

+0

Sprawdź edycję mojej odpowiedzi, aby uzyskać więcej pomysłów. –

1

Poszukałbym prostego i prostego rozwiązania. Na przykład niestandardowy element sterujący reprezentujący jedną linię (czyli dwa przyciski opcji i etykieta).

EDYCJA: OK, myślę, że rozumiem teraz twoje wymagania. Nie możesz po prostu mieć dwóch kolekcji radiobuttonów: tych w kolumnie A i tych w kolumnie B?

Gdy formularz zostanie narysowany, dodaj je do dwóch list < RadioButton> lub cokolwiek innego i powiązaj je z dwoma osobnymi wydarzeniami: columnARBChecked, columnBRBChecked. Kiedy jedno z wydarzeń się rozpali, możesz wywołać logikę, aby sprawdzić/odznaczyć pozostałe radiobutki, jak chcesz.

+0

To będzie działać zamiast TableLayoutPanel dla celów układu, pewnie. Problem z tym rozwiązaniem polega na tym, że przyciski wewnątrz kontrolki użytkownika będą nadal pogrupowane w kontrolerze użytkownika.Tak więc miałbym tyle grup, co instancje kontroli użytkownika zamiast 2 grup (po jednej dla każdej kolumny). –

+0

Obawiam się, że zupełnie nie rozumiem twojego wymagania. Chcesz poprawnie grupować w poziomie? Dlaczego chcesz również panele pionowe? Dlaczego nie możesz po prostu zapętlić kolekcji niestandardowych elementów sterujących i przeczytać, który przycisk opcji jest tam zaznaczony? –

+0

Przepraszam, będę edytować pytanie, aby wyjaśnić, że w rzeczywistości grupowanie horyzontalne (czyli to, co dzieje się domyślnie) nie jest tym, czego potrzebuję, ale pionowym grupowaniem. dzięki. –

Powiązane problemy