Korzystanie z WinForms; Czy jest lepszy sposób na znalezienie zaznaczonego RadioButton dla grupy? Wydaje mi się, że poniższy kod nie powinien być potrzebny. Kiedy sprawdzasz inny RadioButton, wtedy wie, który z nich odznaczyć… więc powinien wiedzieć, który jest zaznaczony. Jak pobrać te informacje bez wykonywania wielu instrukcji if (lub przełączania).
RadioButton rb = null;
if (m_RadioButton1.Checked == true)
{
rb = m_RadioButton1;
}
else if (m_RadioButton2.Checked == true)
{
rb = m_RadioButton2;
}
else if (m_RadioButton3.Checked == true)
{
rb = m_RadioButton3;
}
c#
.net
winforms
radio-button
Pałka policjanta
źródło
źródło
Odpowiedzi:
Możesz użyć LINQ:
Zauważ, że wymaga to, aby wszystkie przyciski radiowe znajdowały się bezpośrednio w tym samym kontenerze (np. Panel lub Formularz), a kontener zawiera tylko jedną grupę. Jeśli tak nie jest, możesz utworzyć
List<RadioButton>
s w konstruktorze dla każdej grupy, a następnie napiszlist.FirstOrDefault(r => r.Checked)
.źródło
s.FirstOrDefault
zamiastlist.FirstOrDefault
w drugim akapicie Twojej odpowiedzi?s
to liczba mnoga , a nie nazwa zmiennej.Możesz połączyć CheckedEvents wszystkich przycisków z jednym programem obsługi. Tam możesz łatwo uzyskać prawidłowe pole wyboru.
źródło
Dla osób bez LINQ:
źródło
OP chciał uzyskać sprawdzone RadioButton WEDŁUG GRUPY. Chociaż odpowiedź @SLaks jest doskonała, tak naprawdę nie odpowiada na główne pytanie OP. Aby poprawić odpowiedź @SLaks, po prostu idź o krok dalej LINQ.
Oto przykład z mojego własnego działającego kodu. W normalnym WPF moje RadioButtons są zawarte w
Grid
(o nazwie „myGrid”) z kilkoma innymi typami kontrolek. Mam dwie różne grupy RadioButton w siatce.Aby pobrać zaznaczony element RadioButton z określonej grupy:
Jeśli w Twoim kodzie nie ma możliwości sprawdzania RadioButtons, użyj
SingleOrDefault()
(Jeśli nie używam przycisków trójstanowych, zawsze ustawiam jeden przycisk „IsChecked” jako domyślny).źródło
.Where(r => r.GroupName == "GroupName" && r.IsChecked == true)
ponieważr.IsChecked
właściwość bool dopuszcza wartość null.Możesz użyć zdarzenia CheckedChanged dla wszystkich swoich RadioButtons.
Sender
będą niezaznaczone i zaznaczone RadioButtons.źródło
Możesz użyć metody Extension, aby wykonać iterację kolekcji Parent.Controls RadioButton. Pozwala to na wysyłanie zapytań do innych RadioButtons w tym samym zakresie. Korzystając z dwóch metod rozszerzania, możesz użyć pierwszej, aby określić, czy wybrane są jakiekolwiek RadioButtons w grupie, a następnie użyć drugiej, aby uzyskać zaznaczenie. Pole Tag RadioButton może służyć do przechowywania Enum w celu zidentyfikowania każdego RadioButton w grupie:
Oto typowy wzorzec użycia:
źródło
Oprócz okablowania CheckedChangedEvent można by użyć właściwości Controls "Tag" do rozróżnienia przycisków radiowych ... alternatywą (kodu spaghetti) byłaby właściwość "TabIndex"; P
źródło
Czasami w takich sytuacjach tęsknię za młodością, kiedy Access był moją wybraną trucizną i mogłem nadać każdemu przyciskowi w grupie własną wartość.
Moja sztuczka w C # polega na używaniu tagu do ustawiania wartości, a kiedy dokonuję wyboru z grupy, czytam wartość tagu wybranego radiobutton. W tym przykładzie directionGroup to grupa, w której mam cztery pięć przycisków radiowych z tagami „None” i „NE”, „SE”, „NW” i „SW” na pozostałych czterech radiobuttons.
Aktywnie użyłem przycisku do przechwycenia wartości zaznaczonego przycisku, ponieważ przypisanie jednego programu obsługi zdarzenia do zdarzenia CHeckCHanged wszystkich przycisków powoduje uruchomienie KAŻDEGO przycisku, ponieważ zmiana jednego zmienia je wszystkie. Zatem wartością nadawcy jest zawsze pierwszy element RadioButton w grupie. Zamiast tego używam tej metody, gdy muszę dowiedzieć się, która z nich jest wybrana, z wartościami, które chcę pobrać we właściwości Tag każdego RadioButton.
FYI, przetestowałem i wykorzystałem to w mojej pracy.
Joey
źródło
jeśli chcesz zapisać zaznaczenie do pliku lub innego i zadzwonić później, oto co robię
następnie zadzwoń do tego za pomocą
źródło
Jeśli chcesz uzyskać indeks wybranego przycisku radiowego wewnątrz kontrolki, możesz użyć tej metody:
Przykładowe zastosowanie:
Kod nie jest dobrze przetestowany, ale wydaje się, że kolejność indeksów jest od lewej do prawej i od góry do dołu, jak podczas czytania tekstu. Jeśli nie zostanie znaleziony żaden przycisk radiowy, metoda zwraca -1.
Aktualizacja: Okazało się, że moja pierwsza próba nie zadziałała, jeśli w kontrolce nie ma przycisku radiowego. Dodałem blok try i catch, aby to naprawić, i metoda wydaje się teraz działać.
źródło
GroupBox ma w tym celu zdarzenie Validated, jeśli używasz WinForms.
źródło
Dla programistów używających VB.NET
źródło