C# Windows Forms -> Arbeiten mit Tags

Abcd12345

Lt. Junior Grade
Registriert
März 2006
Beiträge
483
Hi,

Ich habe in meiner Windows Forms Anwendung Sowohl Buttons als auch Textboxen mit Tags versehen.

Jetzt möchte ich mir eine Methode schreiben die aufgerufen wird wenn ein Button gedrückt wird. In der MEthode soll die Tag Nr. des aufrufenden Buttons abgefragt werden und dann im Textbox Objekt welches die selbe Tag Nr. wie der Button hat die Text Eigenschaft verändert werden.

Ich weis grade nicht wie ich das bewerkställigen soll. Ich brauche ja irgendwie zugriff auf eine Art Liste der Buttons und Textboxen.

Würde mich über Hilfe freuen :)

Mfg
 
Du erstellst eine Methode, die du den Click-Events der Buttons zuordnest. Im sender-Objekt findest du sicher die Info zu den Tags.
Code:
        private void button_Click(object sender, EventArgs e)
        {

        }
Allerdings finde ich das recht umständlich. Ich würde für jeden Button eine eigene Click-Methode generieren lassen. Dann ist klar, welche Textbox geändert werden muss und die Tag-Geschichte entfällt komplett.


Edit: Mir fällt gerade ein, dass dir die "Liste" mit den Textboxen noch fehlt, wenn du nach obigem Schema vorgehen willst. Da dürfte sich was im System.Reflection(.Emit)-Namespace finden lassen. Wie gesagt, alles ziemlich umständlich...
 
Zuletzt bearbeitet:
Danke schon mal für die Hilfe.

Es sind extrem viele Buttons und textboxen deswegen möchte ich mir das ganze mit tags etwas erleichtern weil im grunde immer wieder das selbe passiert.

Weis jemand genaueres wie ich eine Art Liste meiner Textboxen bekomme:

Ich hatte mit das ganze so vorgestellt:

Code:
        private void button_Click(object sender, EventArgs e)
        {
              TextBoxList[sender.Tag].Text = "Muster Text";
        }

Ich hoffe das ich damit nochmals verdeutlichen konnte was ich ereichen möchte :)

Mfg
 
Dann nimm doch eine ArrayList oder eine generische Liste mit dem Textbox-Typ, in dem du alle Textboxen speicherst. Durch die kann man sich dann schön durchhangeln und die Tags prüfen...
 
Muss ich manuel alle Textboxen in der Liste speichern oder gibt es auch eine möglichkeit sich das ganze zu vereinfachen?

Wie gesagt sind es sehr viele textboxen...


Mfg
 
Eine Windows Form hat die Property "Controls", in der alle Controls aufgelistet sind, die die Form enthält.
Darüber lässt sich leicht auf die Buttons zugreifen:

PHP:
            List<Button> btnList = new List<Button>();

            foreach (Control ctrl in this.Controls)
            {
                if (ctrl is Button)
                {
                    btnList.Add((Button)ctrl);
                }
            }

Edit: Ups, ich dachte du willst die Buttons, aber egal, das ganze geht auch genauso mit Textboxen.
 
Zuletzt bearbeitet:
Danke
Ergänzung ()

Okey sorry aber hab doch nochmal ein Problem:



Habe mir jetzt eine Textboxenliste erzeugt:
Code:
        List<TextBox> textboxList = new List<TextBox>();

Und die Textboxen geaddet:
Code:
            foreach (Control ctrl in this.Controls)
            {
                if (ctrl is TextBox)
                {
                    textboxList.Add((TextBox)ctrl);
                }
            }


Ich habe nun aber das Problem, dass das Objekt "sender" keine Eigenschaft hat die Tag heißt:
Code:
        private void Add(object sender, EventArgs e)
        {
 
            textboxList[sender.Tag].Text = Convert.ToString(Convert.ToDouble(textboxList[sender.Tag].Text) + 1);
        }

Fehlermeldung:
Code:
Fehler	1	"object" enthält keine Definition für "Tag", und es konnte keine Erweiterungsmethode "Tag" gefunden werden, die ein erstes Argument vom Typ "object" akzeptiert. (Fehlt eine Using-Direktive oder ein Assemblyverweis?)

Hilfe wäre nett :)

Mfg
 
Nabend,

einige Probleme und Vorschläge dazu:
1.
Zunächst dürften sich in der .Controls Collection einer Form/eines Controls nur die direkt darin liegenden Controls befinden.
Wenn du Buttons und/oder TextBoxen in Panels oder ähnlichem angeordnet hast, müsstest du dich durch den Baum hangeln um alle deine Elemente zu finden.

2.
Du möchtest in der Liste über das Tag zugreifen, wo eine Nummer drin gespeichert ist (wenn ich das richtig verstanden habe). Da du einfach nur List<>.Add() aufrufst, ist nicht Reihenfolge den Tags nach aufsteigend garantiert. Du würdest dich darauf verlassen, dass die Reihenfolge in der Controls Collection zufällig der Reihenfolge deiner Tags entspricht.
Ich würde dir daher zu nem Dictionary raten...
Wenn es sich um Nummern handelt: Dictionary<int, TextBox>
Für den Zugriff darauf solltest du das object, welches du aus der Tag-Property bekommst noch in einen int umwandeln um Wertesemantik zu erreichen. Ansonsten könnte dir sowas passieren wie 2 != 2 wenn beides in Objekte verpackt ist und auf Identität statt Gleichheit geprüft wird.
Convert.ToInt32(object obj) ist dein Freund.

3.
Für den Zugriff auf die Tag-Property vom sender hat mein Vorredner schon den richtigen Tip gegeben...
Entweder per "as" oder halt:

Button mySender = (Button)sender;
textBoxDict[Convert.ToInt32(mySender.Tag)].Text = "Bla";

Plus die ganze Logik um den Kram abzusichern...

LG und nen schönes Wochenende
Ben
 
Zurück
Oben