edycja wielu właściwości formatek

0

witam,
mam wiele obiektów np. textBox1 aż do textBox301
i teraz moje pytanie czy jest jakiś sprytny sposób szybkiej zmiany stanów tych wszystkich obiektów czyli mogę pisać this.textBox1.Text = ""; this.textBox2.Text = ""; this.textBox3.Text = ""; itd. ale czy można to jakoś skrócić? jakby to poniżej działało, to bym to użył :-)
for (byte d = 1; d < 300; d++)
{
this.richTextBox + d + .Text = "0";
}

0

Np można tak

Wrzucasz te textboxy do Panelu w tym przypadku jest to panel1 i robisz tak

            foreach (TextBox tb in panel1.Controls)
            {
                tb.Text = "aaa";
            }
0

Po pierwsze byte na maksa mieści 255.

Po Twojemu:

for (int i = 1; i <= 301; i++)
    this.Controls["textBox" + i].Text = "0";

Ale, jeśli chcesz, zmienić wszystkim TextBoxom na formatce, możesz to zrobić też tak:
2.0:

foreach(Control c in this.Controls)
    if(c is TextBox)
        c.Text = "0";

3.5:

foreach (TextBox t in this.Controls.OfType<TextBox>().ToArray())
    t.Text = "0";

@up - po co wrzucać na panel? I czemu mamy sobie InvalidCastException fundować?

0

Oczywiscie InvalidCastException otrzymamy jak w panelu bedzie cos innego niz textbox:). Hmm w panelu zeby to jakos uporzadkowane bylo.

@somekind
foreach (TextBox t in this.Controls.OfType<TextBox>())
t.Text = "0";

Nie trzeba na koncu Array(), this.Controls.OfType<TextBox>() jest typu IEnumerable.

Majac textBox np w panelu to tym fragmentem kodu nie zmienisz jego wlasciwosci, to tyle odnosnie zmiany wszystkim txtbox'om na formatce.

0

Teoretycznie możesz przeszukać całe drzewo kontrolek, np tak:

        private IEnumerable<T> GetFlattenedControls<T>(Control parent) where T : Control
        {
            if (parent is T)
                yield return (T)parent;

            foreach (Control c in parent.Controls)
                foreach (T t in GetFlattenedControls<T>(c))
                    yield return t;
        }

        // ...
         
        foreach (TextBox tb in GetFlattenedControls<TextBox>(this))
            tb.Text = "0";        

Ale to raczej nie jest wzór programowania w formsach. Przydałoby się jakieś zarządzanie tymi TextBoxami, choćby trzymanie ich na jakiejś liście...
A tak z ciekawości: po co tyle TextBoxów? Piszesz edytor hex?

0

Ja proponaowałbym rozwiązanie proste i eleganckie:

List<TextBox> tbList= new List<TextBox>();
...//dodajemy wszystkie elementy do listy
foreach(TextBox tb in tbList) tb.Text=""

Alternatywnie jest jeszcze refleksja

0
hubert_nnn napisał(a)

Alternatywnie jest jeszcze refleksja

A jak chciałbyś tutaj wykorzystać refleksję?

0
hubert_nnn napisał(a)

Ja proponaowałbym rozwiązanie proste i eleganckie: [...]

Proste i eleganckie rozwiązanie podał już wcześniej somekind.

hubert_nnn napisał(a)

Alternatywnie jest jeszcze refleksja

Po co strzelać z armaty do muchy?

0
Form formX = //obiekt twojej klasy
Type t = typeof(formX);
for(int i = 1; i<302; i++){
String name = "textBox1"+i;
((TextBox)t.GetField(name).GetValue(formX)).Text = "";
}

O ile nic nie pokręciłem, to program pobierze typ forma ze zmiennej formX, poszuka jego pól o odpowiednich nazwach textBox1 aż do textBox301 (jak podał studencina), następnie pobierze każde takie pole z obiektu formX :
t.GetField(name).GetValue(formX)
Przerzutuje na typ TextBox, a z nim można już zrobić co się chce. Nie jestem tylko pewien, czy funkcja GetField jest prawidłowa, czy trzeba użyć innej, bo martwi mnie tekst w dokumentacji "Searches for public field"

0
Mendoza napisał(a)
hubert_nnn napisał(a)

Ja proponaowałbym rozwiązanie proste i eleganckie: [...]

Proste i eleganckie rozwiązanie podał już wcześniej somekind.

Rzeczywiście, sry, rozwiązanie somekinda jest nawet lepsze od mojego.

0

O ile nic nie pokręciłem, to program pobierze typ forma ze zmiennej formX, poszuka jego pól o odpowiednich nazwach textBox1 aż do textBox301 (jak podał studencina), następnie pobierze każde takie pole z obiektu formX :
t.GetField(name).GetValue(formX)

Przerzutuje na typ TextBox, a z nim można już zrobić co się chce. Nie jestem tylko pewien, czy funkcja GetField jest prawidłowa, czy trzeba użyć innej, bo martwi mnie tekst w dokumentacji "Searches for public field"

Refleksje w tym przypadku są całkowicie niepotrzebne! Nie dość, że wolne to jeszcze mogą przynieść (w tym przypadku) niepożądane efekty --> ty pobierasz obiekty z klasy Formy, a kontrolki o których mowa znajdują się w polu Controls (zobacz w plik Designera - metoda InitializeComponent().

Oczywiście, jeśli nie modyfikuje nic tam ręcznie - są to te samy obiekty... ale po co utrudniać?

0

dziękuję wszystkim bardzo za pomoc to znacznie skróci mój program.
Hass: nie, to był tylko przykład, chociaż mam ich dużo to jednak nie aż tyle :)

Teraz widzę że źle napisałem temat, powinno być "edycja właściwości wielu formatek" może ktoś zmienić aby w przyszłości inni skorzystali :)

0

Ja bym raczej powiedział, że "zmiana właściwości wielu kontrolek jednej formatki" ;)

Ale widzę, że ten "problem" bardzo często się pojawia na forum. Można by chyba jakąś "publikacje" o tym zrobić ;)

0

Wiem, że to stary temat, ale tylko chcę uzupełnić dla przyszłych pokoleń - może komuś się przyda, bo akurat sam robiłem i ten temat naprowadził mnie na rozwiązanie ;)

one napisał(a)

Majac textBox np w panelu to tym fragmentem kodu nie zmienisz jego wlasciwosci, to tyle odnosnie zmiany wszystkim txtbox'om na formatce.

Akurat ja trafiłem na taki przypadek. Najpierw nie mogłem złapać, czemu mimo poprawnego kodu nie mogę zmusić ComboBox-ów, aby na starcie aplikacji wybrały pierwszy item. Po zacytowanej dygresji nagle nastąpiło oświecenie: miałem je na GroupBox-ach i to co gorsze kilku. Wybrnąłem tak:

            foreach (GroupBox g in this.Controls.OfType<GroupBox>())
            {
                foreach (ComboBox t in g.Controls.OfType<ComboBox>())
                    if (t.Items.Count != 0) // d*pochron jakby się okazało, że itemów brak ;)
                    t.SelectedIndex = 0;
            }

Prosto, schludnie, kilka linijek zamiast ręcznego przypisywania SelectedIndex do każdego. Dla Panelu z pewnością można zastosować tą samą metodę :-) Dzięki one za naprowadzenie na przyczynę błędu i somekind za ładny kodzik pod 3.5 :-)

0

Może to jest proste i schludne, ale na pewno nie elastyczne i uniwersalne. Będziesz pisał oddzielny kod dla ComboBoxów w GroupBoxach, w Panelach, bezpośrednio na Formie i w osadzonych UserControlkach?
Napisz metodę, która rekurencyjnie przeszuka wszystkie kontrolki i wybierze ComboBoxy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1