WPF-Controls mit einer For(i)-Schleife auslesen

  • WPF

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von PadreSperanza.

    WPF-Controls mit einer For(i)-Schleife auslesen

    In meiner XAML-Datei habe ich 10 Buttons hinzugefügt:

    XML-Quellcode

    1. <Button x:Name="button1" Click="button1"/>
    2. <!--<Button.../>-->
    3. <Button x:Name="button1" Click="button10"/>


    Im Code würde ich gerne die Inhalte der Elemente mit einer Foreach-Schleife einlesen.
    Wie schreibe ich den WPF-Code richtig?

    VB.NET-Quellcode

    1. For i = 1 To 10
    2. Controls("button" & i).Content = "Text-Ausgabe"
    3. Next

    so arbeitet man in Wpf überhaupt nicht.

    Such dir mal Tutorials zusammen zum Thema MVVM - ein wichtiger Autor ist Josh Smith - auf Codeproject gibts da einiges.
    Aber auch hier im Wpf-Forum basiert eiglich alles auf MVVM, also guck da mal durch - kommt ja auch immer auf dein aktuellen Kenntnisstand an.
    Ob man so arbeitet, oder nicht sei mal dahin gestellt... Wenn sie es unbedingt so haben will, würde ich es so vorschlagen:


    Die Buttons sind ja in irgend einem Grid... Den Grid vergibst du einen Namen und lässt dir die Kinder ausgeben, die du in einer Liste ablegst:

    VB.NET-Quellcode

    1. Dim ListOfButtons as new List(of Button)
    2. for each item in DeinGrid.Children
    3. if type of item is Button then _
    4. ListOfButton.Add(item)
    5. next


    Jetzt kannst du fröhlich durch die Liste latschen, und die Texte ändern wie du lustig bist...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „EugenIS“ ()

    Danke für die Antwort.
    Anbei Button in einem st.Grid:

    XML-Quellcode

    1. <Page
    2. x:Class="ts.MainPage"
    3. ... .. .
    4. <Grid x:Name="st" >
    5. <Button x:Name="Test1" Content="Test1" Click="KL_1" Margin="10,0,0,0" />
    6. <Button x:Name="Test2" Content="Test2" Click="KL_2" Margin="10,40,0,0" />
    7. <Button x:Name="Test3" Content="Test3" Click="KL_3" Margin="10,80,0,0" />
    8. </Grid>
    9. </Page>


    So habe ich nicht gemeint. Ich möchte die Texte von Button nicht in einer Liste ablegen,
    sondern die Text-Inhalte des Buttons verändern z.B.:

    Aus "Test1" wird "Klick1",
    aus "Test2" wird "Klick2" und
    aus "Test3" wird "Klick3".

    Die Lösung soll vereinfacht aussehen:

    VB.NET-Quellcode

    1. For i = 1 To 3
    2. ???("Test"&i).Content = ("Klick"&i)
    3. Next


    Anstatt mehrerer Button-Zeilen hinzufügen.

    VB.NET-Quellcode

    1. i=1
    2. Test1.Content = ("Klick"&i)
    3. i=i+i
    4. Test1.Content = ("Klick"&i)
    5. i=i+i
    6. Test1.Content = ("Klick"&i)


    Wie der Code für wpf o.g. Fragezeichen lautet muss ich erstmal suchen.
    Habe bereits gestern zwei Bücher bestellt allerdings in deutscher Sprache.

    Übrigens, Dein Code "Children" kann möglicherweise verwenden werden, aber wie die Lösung aussehen soll, das muss ich mich noch beschäftigen.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „kersten83“ ()

    EaranMaleasi: Wo soll es sonst drin sein? Manche können nur einen Kind aufnehmen...

    kersten83: Ich habe schon ganz genau verstanden was du meinst... Du brauchst nicht die Texte, sondern die Buttons selbst... Leider wissen viele nicht, dass wenn du ein Objekt in eine Liste packst, so packst du nur die Adresse von dem Objekt darein... Das heißt wenn du dann damit was machst, verändert sich das Objekt selbst... Probier doch mal...

    VB.NET-Quellcode

    1. Sub New()
    2. InitializeComponent()
    3. Dim list As New List(Of Button)
    4. For Each item In gMain.Children
    5. If TypeOf item Is Button Then
    6. list.Add(CType(item, Button))
    7. End If
    8. Next
    9. For i As Integer = 0 To list.Count - 1
    10. list(i).Content = String.Format("Klick {0}", i + 1)
    11. Next
    12. End Sub


    Somit würde sich dein Content ändern in deiner Oberfläche... Denn in deiner Liste sind keine Texte drin... So gesehen hast du eine Liste von Buttons. KEINE TEXTE... Theoretisch gesehen könntest du durch die liste latschen und all das machen, was du mit einem Button auch machst.

    Hab irgend wie das Gefühl, dass du irgend wie aus VBA zu VB kommst. Hierbei musst du lernen deine Denkweise etwas zu ändern. Wenn du per schleife auf deine Objekte zugreifen willst, dann muss du deine Schleife entsprächen bauen...
    Danke :) Dein Quellcode funktioniert superrr.
    Derzeit beschäftige ich mich sehr oft mit Visual Basic-Excel, aber den Code „TypeOf“ und „(Of Button)“, und „Children“ habe ich noch nie benutzt. Diese möchte ich nicht nur einfach so testen, sondern auch verstehen lernen, wie diese Code-Abläufe funktionieren, was diese bedeuten usw. Ich versuche von VB zu VBA.NET, auch an andere vergleichbare Programmiersprachen heranzukommen, also zu verstehen. Danke Dir, - mit Deinem neuen Code komme ich nun auch mit meinen Fachbüchern . Vielen Dank nochmals, - habe mich sehr gefreut. :thumbsup:
    Freut mich dir helfen zu können. Um dir noch einmal kurz zu erläutern:

    Dein Grid hat Kinder (also als das was du in WPF in das Grid reinsteckst)... Mit der Funktion TypeOf prüfst du, ob es sich bei dem Kind um einen Button handelt, was nicht der Fall sein muss... Es kann ja sein, dass Du in das selbe Grid vielleicht noch Label oder so was reinsteckst... Würdest du auf die Abfrage verzichten, so würde dien Programm an der Stelle meckern, weil der in eine liste von Buttons nur einen Button aufnehmen kann. Wild durcheinander geht nicht, es sei dem du definierst die Liste als Liste von Objekten. Objekt kann alles sein, was wiederum später zu der selben abfrage bringen würde. Ist dein Objekt Button, dann mach dies und das...

    Wie dem auch sei, ich würde dringend empfehlen in deiner Visual Studio Version -> Projekteigenschaften -> Option Explicit auf ON zu stellen...

    Der Hintergrund hier für ist, dass dein VB Programm dann etwas genauer auf die Definition achtet... Weil sonst macht es VB Kompiler irgend wie, aber Kompiler ist auch nur eine Maschine... Für dein Verständnis wäre es besser... Denn wenn Du mich fragen würdest, musst du dich mit Klasse, Objekt usw... noch ein wenig auseinander setzen... Ich glaube die Begriffe sagen dir nur was oberflächliches... Blöderweise kann ich dir nicht mal ein Buch empfehlen, wo es wirklich gut erklärt ist. Deutsche Bücher sind meiner Ansicht nach manchmal sehr umständlich geschrieben. Da sind englische oder anderweitige Sprachen doch schon etwas im Vorteil...
    Ja, ich weiß, der Thread ist alt. Aber da ich bei Recherchen auch immer mal wieder auf ältere Threads stoße, die dann doch von Interesse sein können, habe ich einen Lösungsansatz, der genau die Antwort auf die Frage wäre.

    Ich weiß auch, dass man das nicht so machen sollte, aber genau so kann man es eben machen - vor allem, wenn man sich noch nicht ausreichend mit MVVM oder anderen Praktiken auseinandergesetzt hat.
    Deshalb für alle anderen, die vielleicht eine solche Lösung suchen:

    VB.NET-Quellcode

    1. ​Private Sub SearchAllButtons()
    2. Dim allButtons As New List(Of Button)
    3. For i As Int16 = 0 To 9
    4. allButtons.Add(FindName("Button" & i))
    5. allButtons.ElementAt(i).Content = "Dies ist Button" & i
    6. Next
    7. End Sub


    C#-Quellcode

    1. ​private void SearchAllButtons(){
    2. List<Button> allButtons = new List<Button>();
    3. for (int i = 0; i < 10; i++){
    4. allButtons.Add(FindName("Button" + i));
    5. allButtons.ElementAt(i).Content = "Dies ist Button" + i;
    6. }
    7. }


    Hintergrund bleibt dabei: Man benennt tatsächlich die Elemente einfach von 0 bis >9000 und kann hiermit dennoch alle ansprechen.

    Also wie gesagt: Ich weiß - nicht Praxis aber die Antwort auf die Frage