edycja wielu właściwości formatek

Odpowiedz Nowy wątek
2009-06-24 00:38
studencina
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";
}

Pozostało 580 znaków

2009-06-24 01:28
one
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";
            }

Pozostało 580 znaków

2009-06-24 01:30
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ć?


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."

Pozostało 580 znaków

2009-06-24 01:45
one
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.

Pozostało 580 znaków

2009-06-24 09:31
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?

Pozostało 580 znaków

2009-06-24 10:29
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

Pozostało 580 znaków

2009-06-24 10:49
0
hubert_nnn napisał(a)

Alternatywnie jest jeszcze refleksja

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

Pozostało 580 znaków

2009-06-24 10:54
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?


Pozostało 580 znaków

2009-06-24 11:03
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"

Pozostało 580 znaków

2009-06-24 11:05
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.

Pozostało 580 znaków

2009-06-24 17:26
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ć?


Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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