Muszę uzyskać wszystkie kontrolki w formularzu typu x. Jestem prawie pewien, że kiedyś widziałem ten kod, który używał czegoś takiego:
dim ctrls() as Control
ctrls = Me.Controls(GetType(TextBox))
Wiem, że mogę iterować po wszystkich kontrolkach, które powodują, że dzieci używają funkcji rekurencyjnej, ale czy jest coś łatwiejszego lub prostszego, może na przykład następujący?
Dim Ctrls = From ctrl In Me.Controls Where ctrl.GetType Is Textbox
Odpowiedzi:
Oto inna opcja dla Ciebie. Przetestowałem to, tworząc przykładową aplikację, a następnie umieściłem GroupBox i GroupBox w początkowym GroupBox. W zagnieżdżonym GroupBox umieściłem 3 kontrolki TextBox i przycisk. To jest kod, którego użyłem (zawiera nawet rekursję, której szukałeś)
Aby przetestować to w zdarzeniu ładowania formularza, chciałem policzyć wszystkie kontrolki wewnątrz początkowego GroupBox
I za każdym razem zwracał właściwą liczbę, więc myślę, że będzie to działać idealnie dla tego, czego szukasz :)
źródło
W C # (ponieważ oznaczyłeś go jako taki) możesz użyć wyrażenia LINQ w następujący sposób:
Edytuj dla rekursji:
W tym przykładzie najpierw tworzysz listę kontrolek, a następnie wywołujesz metodę, aby ją wypełnić. Ponieważ metoda jest rekurencyjna, nie zwraca listy, a jedynie ją aktualizuje.
Może to być możliwe w jednej instrukcji LINQ przy użyciu
Descendants
funkcji, chociaż nie jestem z nią tak zaznajomiony. Zobacz tę stronę, aby uzyskać więcej informacji na ten temat.Edytuj 2, aby zwrócić kolekcję:
Jak zasugerował @ProfK, metoda, która po prostu zwraca żądane kontrolki, jest prawdopodobnie lepszą praktyką. Aby to zilustrować, zmodyfikowałem kod w następujący sposób:
źródło
To jest ulepszona wersja rekurencyjnej GetAllControls (), która faktycznie działa na prywatnych zmiennych:
źródło
Połączyłem kilka poprzednich pomysłów w jedną metodę rozszerzającą. Korzyści są takie, że otrzymujesz poprawnie wpisany wyliczalny z powrotem, a dziedziczenie jest poprawnie obsługiwane przez
OfType()
.źródło
Aby to zrobić, możesz użyć zapytania LINQ. Spowoduje to zapytanie o wszystko w formularzu typu TextBox
źródło
var c = this.Controls.OfType<TextBox>()
dałoby tego samego wyniku?Może to starożytna technika, ale działa jak urok. Użyłem rekurencji, aby zmienić kolor wszystkich etykiet kontrolki. Działa świetnie.
źródło
Chciałbym zmienić odpowiedź PsychoCoders: ponieważ użytkownik chce uzyskać wszystkie kontrolki określonego typu, możemy użyć typów generycznych w następujący sposób:
W ten sposób możemy wywołać funkcję w następujący sposób:
źródło
.OfType<T>()
metody Linq niż.Where(c => c.GetType() == typeof(T)).Cast<T>();
uzyskanie tego samego efektu?Nie zapominaj, że możesz również mieć TextBox w innych kontrolkach innych niż kontrolki kontenera. Możesz nawet dodać TextBox do PictureBox.
Więc musisz też sprawdzić, czy
w dowolnej funkcji rekurencyjnej.
Oto wynik, jaki uzyskałem z układu do testowania tego kodu:
Spróbuj tego z jednym przyciskiem i jednym RichTextBox w formularzu.
źródło
Korzystanie z odbicia:
źródło
Oto moja metoda rozszerzenia
Control
używająca LINQ jako adaptacja wersji @PsychoCoder :Zamiast tego wymaga listy typów, która pozwala nie potrzebować wielu wywołań,
GetAll
aby uzyskać to, czego chcesz. Obecnie używam go jako wersji przeciążonej.Stosowanie:
źródło
Czyste i łatwe rozwiązanie (C #):
Pobierz wszystkie pola tekstowe:
źródło
Możesz użyć poniższego kodu
źródło
Oto moja metoda rozszerzenia. Jest bardzo wydajny i leniwy.
Stosowanie:
Kod to:
źródło
Oto rozwiązanie.
https://stackoverflow.com/a/19224936/1147352
Napisałem ten fragment kodu i wybrałem tylko panele, możesz dodać więcej przełączników lub ifów. w tym
źródło
źródło
Wyrażenia lambda
źródło
Zmodyfikowałem z @PsychoCoder. Wszystkie kontrolki można teraz znaleźć (w tym zagnieżdżone).
źródło
To może zadziałać:
Myślę, że funkcja uzyskiwania wszystkich kontrolek, o których mówisz, jest dostępna tylko dla WPF .
źródło
Oto przetestowane i działające ogólne rozwiązanie:
Mam dużą liczbę kontrolek UpDownNumeric, niektóre w głównej formie, inne w skrzynkach grupowych w formularzu. Chcę, aby tylko ostatnia wybrana kontrolka zmieniła kolor z powrotem na zielony, dla którego najpierw ustawiłem wszystkie inne na biały, używając tej metody: (można również rozszerzyć na wnuki)
źródło
Możesz spróbować, jeśli chcesz :)
źródło
Chociaż kilku innych użytkowników opublikowało odpowiednie rozwiązania, chciałbym opublikować bardziej ogólne podejście, które może być bardziej przydatne.
Jest to w dużej mierze oparte na odpowiedzi JYeltona.
źródło
źródło
źródło
Dla każdego, kto szuka wersji VB kodu C # Adama napisanej jako rozszerzenie
Control
klasy:UWAGA: dodałem
BaseType
dopasowanie dla wszelkich pochodnych kontrolek niestandardowych. Jeśli chcesz, możesz to usunąć lub nawet ustawić jako parametr opcjonalny.Stosowanie
źródło
Utwórz metodę
I użyj go jak
źródło
Używam VB, więc napisałem metodę rozszerzającą. To powoduje pobranie wszystkich elementów podrzędnych i podrzędnych kontrolki
Następnie możesz go użyć w taki sposób, że „btnList” jest kontrolką
W takim przypadku wybierze wybrany przycisk opcji.
źródło
Po prostu:
źródło