none
Steuerelemente von einem Panel abfragen RRS feed

  • Frage

  • Hallo,

     

    habe eine Liste aus Panels. Wie kann ich von einem bestimmten Panel die Steuerelemente abfragen?Wie mache ich das?

     

    private Dictionary<String, Panel> panel_list;

    Panel p = panel_list[panelname];

    Danke schon im Voraus!

    Grüße trap

    Donnerstag, 18. Oktober 2012 07:39

Antworten

  • Hallo,

    das geht auch. Oder aber:

                foreach (CheckBox checkBox in p.Controls.OfType<CheckBox>())
                {
                    if (checkBox.Text == "Test")
                        checkBox.Text = "geändert";
                }
    

    womit der Filter auf CheckBox(en) bereits im Enumerator erfolgt.

    Noch einen Schritt weiter ginge:

                var testCheckBoxes = p.Controls.OfType<CheckBox>()
                    .Where(c => c.Text == "Test");
                foreach (CheckBox checkBox in testCheckBoxes)
                    checkBox.Text = "geändert";
    

    wobei man den Filter um beliebiges erweitern kann.
    (Ich würde allerdings empfehlen, den CheckBoxen Namen zu geben, anstatt die Text-Eigenschaft auszuwerten.)

    Anstatt p kann man auch panel_list[panelname] einsetzen.
    Probiere einfach ein wenig weiter, da ist noch vieles mehr möglich mit LINQ.

    Gruß Elmar

    Montag, 22. Oktober 2012 09:47
    Beantworter

Alle Antworten

  • Hallo,

    untergeordnete Steuerelemente findest Du bei Windows Forms - nicht nur bei Panels - in der Controls-Auflistung, siehe auch Control.ControlCollection.

    Gruß Elmar

    Donnerstag, 18. Oktober 2012 09:28
    Beantworter
  • Hallo,

    Wenn panelname in deinem Code eine Referenz auf eine Zeichenkette ist, die den Schlüssel zum KeyValuePair<String,Panel> darstellt, dann würde ich Elmars richtigen Vorschlag beherzigen: Mit panel_list[panelname].Controls erhältst Du eine Referenz auf die Controls-Auflistung, die jede von Control abgeleitete Klasse besitzt.

    Unterscheiden sich jedoch Schlüssel und Panel-Name, d.h. wenn panelname nicht der Schlüssel sondern eben Panel.Name ist, kannst Du über eine LINQ-Abfrage das passende Panel ermitteln: 

    var foundKeyValuePair = panel_list.Where(kvp => kvp.Value.Name == "Panel2").SingleOrDefault();
    if(foundKeyValuePair != null)
       Panel secondPanel = foundKeyValuePair.Value;

    LINQ bietet auch die Möglichkeit an nur bestimmte Steuerelemente zu filtern, z.B.:

    var foundPanel = foundKeyValuePair.Value;
    var allButtonsInPanel = foundPanel.Controls.OfType<TextBox>();

    Gruß
    Marcel

    Donnerstag, 18. Oktober 2012 11:22
    Moderator
  • Danke erstmals für eure Antwort!

    also nach bisschen rumprobieren bin ich auf das gekommen

    Panel p = panel_list[panelname];

    foreach(Control c in p.Controls) { if(c is CheckBox){ if(c.Text == "Test") c.Text = "geändert"; } }

    das müsste ja auch immer gehen? dann habe ich ja quasi nur Zugriff auf die Steuerelemente von diesem Panel.

    Gruß trap


    • Bearbeitet trap12 Montag, 22. Oktober 2012 06:47
    Montag, 22. Oktober 2012 06:45
  • Hallo,

    das geht auch. Oder aber:

                foreach (CheckBox checkBox in p.Controls.OfType<CheckBox>())
                {
                    if (checkBox.Text == "Test")
                        checkBox.Text = "geändert";
                }
    

    womit der Filter auf CheckBox(en) bereits im Enumerator erfolgt.

    Noch einen Schritt weiter ginge:

                var testCheckBoxes = p.Controls.OfType<CheckBox>()
                    .Where(c => c.Text == "Test");
                foreach (CheckBox checkBox in testCheckBoxes)
                    checkBox.Text = "geändert";
    

    wobei man den Filter um beliebiges erweitern kann.
    (Ich würde allerdings empfehlen, den CheckBoxen Namen zu geben, anstatt die Text-Eigenschaft auszuwerten.)

    Anstatt p kann man auch panel_list[panelname] einsetzen.
    Probiere einfach ein wenig weiter, da ist noch vieles mehr möglich mit LINQ.

    Gruß Elmar

    Montag, 22. Oktober 2012 09:47
    Beantworter
  • Danke Elmar!

    Viele Grüße

    trap

    Dienstag, 23. Oktober 2012 07:28