• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Jak przekonwertować stringa na nazwę obiektu przycisku?

VPS Starter Arubacloud
+1 głos
234 wizyt
pytanie zadane 8 marca 2022 w C# przez xLipeq Nowicjusz (210 p.)
zamknięte 9 marca 2022 przez xLipeq
//Wszystkie BT*numer* to obiekty Button utworzone w xaml
private void HideAllButtons()
        {
            string but = "BT";
//Chciałbym za pomocą tego stringa dostać się do obiektów poniżej.
            for(int i = 1; i <= 20; i++)
            {
                if(i <10)
                {
                    but += "0" + i.ToString();
                }
                else
                {
                    but += i.ToString();
                }
            }
// zamiast tak:
            BT01.Visibility = Visibility.Hidden;
            BT02.Visibility = Visibility.Hidden;
            BT03.Visibility = Visibility.Hidden;
            BT04.Visibility = Visibility.Hidden;
            BT05.Visibility = Visibility.Hidden;
            BT06.Visibility = Visibility.Hidden;
            BT07.Visibility = Visibility.Hidden;
            BT08.Visibility = Visibility.Hidden;
            BT09.Visibility = Visibility.Hidden;
            BT10.Visibility = Visibility.Hidden;
            BT11.Visibility = Visibility.Hidden;
            BT12.Visibility = Visibility.Hidden;
            BT13.Visibility = Visibility.Hidden;
            BT14.Visibility = Visibility.Hidden;
            BT15.Visibility = Visibility.Hidden;
            BT16.Visibility = Visibility.Hidden;
            BT17.Visibility = Visibility.Hidden;
            BT18.Visibility = Visibility.Hidden;
            BT19.Visibility = Visibility.Hidden;
            BT20.Visibility = Visibility.Hidden;
        }

Chciałbym za pomocą pętli dostać się do każdego z obiektów. Jak to zrobić?

komentarz zamknięcia: Problem rozwiązany poprzez:     private static IEnumerable<T> [...]
komentarz 8 marca 2022 przez VBService Ekspert (251,270 p.)
edycja 8 marca 2022 przez VBService

BTW, ten zapis

            string but = "BT";
            for(int i = 1; i <= 20; i++)
            {
                if(i <10)
                {
                    but += "0" + i.ToString();
                }
                else
                {
                    but += i.ToString();
                }
            }

 

da taki wynik w końcowym efekcie

BT0102030405060708091011121314151617181920

 

[ on-line ]

using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string but = "BT";
            
            for (int i = 1; i <= 20; i++)
            {
                if (i < 10)
                {
                    but += "0" + i.ToString();
                }
                else
                {
                    but += i.ToString();
                }
                Console.WriteLine(but);
            }
            Console.ReadLine();
        }
    }
}

 

2 odpowiedzi

+1 głos
odpowiedź 8 marca 2022 przez VBService Ekspert (251,270 p.)
wybrane 9 marca 2022 przez xLipeq
 
Najlepsza

[UPDATE] 

//Wszystkie BT*numer* to obiekty Button utworzone w xaml

Z początku nie zwróciłem uwagi.  wink

 

propozycja 1

        private static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
        {
            if (depObj != null)
                for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
                {
                    DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
                    if (child != null && child is T)
                        yield return (T)child;

                    foreach (T childOfChild in FindVisualChildren<T>(child))
                        yield return childOfChild;
                }
        }

        private void HideAllButtons()
        {
            foreach (Button btn in FindVisualChildren<Button>(this))
                if (btn.Name.Contains("BT"))
                    btn.Visibility = Visibility.Hidden;
        }

 

propozycja 2

        private List<Control> GetAllControls()
        {
            Panel mainContainer = (Panel)this.Content;
            UIElementCollection element = mainContainer.Children;
            List<FrameworkElement> lstElement = element.Cast<FrameworkElement>().ToList();

            return lstElement.OfType<Control>().ToList();
        }

        private void HideAllButtons()
        {
            foreach (Control contol in GetAllControls())
            {
                if (contol is Button)
                    if (contol.Name.Contains("BT"))
                        contol.Visibility = Visibility.Hidden;
            }
        }

 

 

 

P.S.1

        private void ToggleAllButtons()
        {
            foreach (Button btn in FindVisualChildren<Button>(this))
                if (btn.Name.Contains("BT"))
                    if (btn.Visibility == Visibility.Hidden)
                        btn.Visibility = Visibility.Visible;
                    else
                        btn.Visibility = Visibility.Hidden;
        }

P.S.2 Trees in WPF

 

 


Możesz spróbować tak

            for (int i=1; i<=20; i++)
            {
                Button btn = (Button)this.Controls["BT" + ((i < 10) ? '0' + i.ToString() : i.ToString())];
                btn.Visible = false;
            }

 

lub tak

            foreach (Button btn in Controls.OfType<Button>())
                if (btn.Name.Contains("BT"))
                    btn.Visible = false;

 

+2 głosów
odpowiedź 8 marca 2022 przez adrian17 Ekspert (344,100 p.)

Zamiast pojedynczo próbować się do nich dostawać przez stringi, po prostu zrób tablicę. Wtedy wystarczy zwykła pętla

private void HideAllButtons()
{
    foreach (var button in buttons)
    {
        button.Visibility = Visibility.Hidden;

i tyle :)

Podobne pytania

+2 głosów
1 odpowiedź 81 wizyt
0 głosów
1 odpowiedź 200 wizyt
pytanie zadane 26 maja 2017 w C# przez rafal085 Nowicjusz (120 p.)
0 głosów
0 odpowiedzi 142 wizyt
pytanie zadane 5 października 2020 w C# przez troian1337 Użytkownik (720 p.)

92,455 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...