Steuerelement-Namen in Schleife



  • Hi,

    bei mir bläht sich der Code immer mehr auf weil ich sehr viele Bindings verwende. Das würde ich gern straffen und ähnliche Bindings in einer Schleife definieren. Ich weiss aber nicht wie man Teile von Steuerelement-Namen variabel erfassen kann.

    Beispiel: Wenn ich zwei TextBoxen mit den Namen "textBox1" und "textBox2" habe, wie kann ich dann die Zahl im Namen variabel behandeln?

    for (int i = 1; i <= 2; i++)
    {
        textBox+"i".Text = Convert.ToString(i);
        //oder
        textBox[i].Text = Convert.ToString(i);
    }
    

    So geht das natürlich nicht aber sollte klar machen was ich brauche.
    Ich weiss zwar schon dass ich das mit dem unteren Beispiel machen kann, wenn ich die Elemente nicht im Designer platziere, sondern im Code zur Laufzeit erzeuge. Das wär aber eine Sauarbeit bei meinen vielen Elementen, daher meine Hoffnung dass das irgendwie geht, Teile des Elementnamens variabel zu erfassen.

    Grüsse
    Ank



  • Solange die Controls alle innerhalb eines Panels (Canvas, Grid, DockPanel, StackPanel, ...) sind, kannst du einfach deren Children-Eigenschaft (evtl. rekursiv) durchlaufen und das Binding an den Subcontrols durchführen.

    Aber schau auch mal in den Artikel [FAQ] Variablennamen zur Laufzeit zusammensetzen rein.



  • @Th69

    Meine Elemente befinden sich zwar alle auf dem selben Grid, sind aber in GroupBoxen organisiert. Wenn ich Grid.Children.Count abfrage, bekomme ich nur die Anzahl der Groupboxen. Und bei

    Grid.Children[0].     // ???
    

    hilft mir Intellisense nicht weiter bzw. ich weiss nicht wie ich dann an die Elemente in den Groupboxen rankomme und ob das überhaupt geht.

    Bei der genannten FAQ habe ich allerdings eine Lösung gefunden die mir zusagt:

    TextBox[] textBoxes = new TextBox[] { this.textBox1, this.textBox2 };
    

    Danke für den Hinweis 🙂

    Allerdings würde ich trotzdem gern wissen wie man Bindings über Grid.Children setzt. Mein erster plumper Versuch mit nur einer Textbox auf dem Grid

    GridName.Children[0].Source = myObject;
    GridName.Children[0].SetBinding(TextBox.TextProperty, BindingName);
    

    funktioniert leider nicht 😃

    Grüsse
    Ank



  • Du mußt dann noch auf den entsprechenden Controltyp casten, z.B.

    foreach (var control in GridName.Children)
    {
        TextBox textBox = control as TextBox;
        if (textBox != null)
        {
            textBox.Source = myObject;
            // ...
        }
    }
    

    Children beinhaltet nur den statischen Typ UIElement, von dem alle anderen WPF-Controls abgeleitet sind. Für allgemeine Eigenschaften reicht aber auch meistens auf FrameworkElement zu casten.



  • Hm, mit Controltypen kenne ich mich nur rudimemtär aus bzw. hab ich bisher noch nicht gebraucht. Ich heb's mir aber auf bis die Zeit kommt.

    Gruss und Dank von
    Ank 🙂


Anmelden zum Antworten