Probleme bei For Each

  • .NET (FX) 3.0–3.5
  • VB.NET

Es gibt 29 Antworten in diesem Thema. Der letzte Beitrag () ist von Popa21.

    Probleme bei For Each

    Hallo zusammen,
    ich bin neu hier und hoffe ich stelle die Frage im richtigen Forum.
    Folgendes Problem stellt sich mir gerade:
    Auf meiner Form liegt ein Tab-Control.
    Auf jeder Seite (10 ges.) des Tab-Controls liegen Textboxen und eine Gruoup-Box.
    Die Tab-Pages sind wie folgt benannt: Seite1 - Seite 10
    Wenn ich nun in einer For Each Abfrage meine Textboxen füllen möchte

    VB.NET-Quellcode

    1. For Each tb As System.Windows.Forms.TextBox In Seite1.Controls
    2. If tb.Name.Contains("tbPos" & i) Then
    3. tb.Text = oCellPosition.Value
    4. End If
    5. Next

    gibt er mir eine Fehlermeldung über die Groupbox raus. (Fehlermeldung hängt an)
    Hat da evt. jemand einen Tip für mich?
    Gruß
    KlaKa

    Verschoben. ~Trade
    Bilder
    • Fehleranzeige.JPG

      81,71 kB, 978×327, 159 mal angesehen

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

    Controls umfasst auch die GroupBox, nicht nur die TextBoxen. Eine GroupBox ist aber keine TextBox, wie Du an der Exception erkennen kannst. Die Schleife kann also nicht einfach diesen Typen als TextBox behandeln.
    Du musst also die TextBoxen filtern, damit die GroupBox gar nicht erst dabei ist.

    VB.NET-Quellcode

    1. For Each tb As System.Windows.Forms.TextBox In Seite1.Controls.OfType(Of TextBox)
    2. If tb.Name.Contains("tbPos" & i) Then
    3. tb.Text = oCellPosition.Value
    4. End If
    5. Next


    Dazu musst Du System.Linq.Extensions importieren.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Hallo Trade,
    wenn ich OfType(Of TextBox) hinten dran setze ist zwar die Fehlermeldung weg aber meine Textboxen bleiben leer.
    Lasse ich das OfType(Of TextBox) aber weg und entferne die Groupbox von der tabpage werden wieder Daten reingeschrieben.

    Gruß
    KlaKa
    Könnte es sein, dass du die Textboxen innerhalb der GroupBox hast?
    Dann müsstest du das ganze entweder rekursiv durchsuchen, oder direkt die GroupBox-Controls durchlaufen
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Hallo jvbsl,
    nein die Textboxen liegen neben der Groupbox, sonst würden sie ja auch nicht mehr befüllt werden wenn ich die Groupbox entferne.

    Habe jetzt entdeckt das der Import von

    VB.NET-Quellcode

    1. System.Linq.Extensions

    nicht funktioniert hat. Das gibt vb auch nicht vor.

    Dann setze mal einen Haltepunkt und schau, was gefiltert wird.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    @horstfh Der Code ist auch nicht anders als meiner, außer dass Du hier noch explizit eine Typprüfung brauchst, was imho redundant ist, wenn man direkt filtert. Der hatte allerdings das Problem nicht gelöst.

    @KlaKa Du kannst Haltepunkte im Programm setzen, d.h. das Programm unterbricht die Ausführung dort und Du kannst Dir die ganzen Member ansehen. Somit erkennst Du, was wo drinsteht und kannst die Schritte des Programms nachvollziehen.
    Dazu einfach ganz links in der betroffenen Zeile klicken, bis der rote Kreis auftaucht. Dann einfach, wenn es unterbricht, mit der Maus über die Member hovern, damit Du den Inhalt siehst.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    @KlaKa also ich hab jetzt mal testweise deinen Aufbau nachgebaut, ein Tabcontrol mit 10 Seiten, jeweils mit Textboxen und daneben einer Groupbox gefüllt, und sowohl der Code von @Trade als auch der Code von @horstfh
    funktionieren und füllen die Textboxen problemlos, evtl. liegt der Fehler also woanders in deinem Programm, also versuche mal wie Trade es meinte per Haltepunkt korrekt zu debuggen, oder häng notfalls mal deine komplette Projektmappe als Archiv an, damit man sich mal das ganze Problemchen ansehen kann

    Greets
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    Hallo asusdk,
    ich schrieb ja schon das der Import von

    VB.NET-Quellcode

    1. System.Linq.Extensions
    nicht funktionier weils halt nicht vorgegeben ist.
    Andererseits gibt es im Vb Express leider nicht so schöne Filtermöglichkeiten wie bei den anderen Programmen.
    Da wird so vieles angezeigt dass ich gar nicht weiß was jetzt relavant für den Fall ist.
    Gruß
    KlaKa
    @KlaKa ja der Import funktioniert hier ebenso wenig (VS 2017) aber der Code läuft zumindest hier dennoch

    Edit: hab jetzt auch mal nach "System.Linq.Extensions" gegoogelt und nicht einen dazugehörigen Eintrag gefunden, ich will nichts unterstellen, aber möglicherweise ist eigentlich
    "System.Linq.Expressions" gemeint (ist in meinem Standardprojekttemplate bereits standardmäßig importiert)
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If

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

    Mach mal nur System.Linq.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    @KlaKa Setze einen Haltepunkt drauf und identifiziere die Controls, die er tatsächlich findet.
    Arbeite jede Zeile einzeln ab und überzeuge Dich davon, dass sie auch das tut, was sie tun soll.
    Allein der Umstand, dass der Code compiliert, heißt nicht, dass er auch läuft.
    Gugst Du hier.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ok das is schon mal ein Hinweis.
    Leider ist es mir nicht möglich das Projekt anzuhängen, da ich Informationen aus einem anderen Programm ziehe und die in die Textboxen reinschreibe.
    Was natürlich möglich wäre:
    Das Programm heißt Inventor und ich muss auch dieses Programm importieren.
    Daraus folgt dass z.B. meine Codezeile zum beenden des Programms anstatt

    VB.NET-Quellcode

    1. Application.exit

    in

    VB.NET-Quellcode

    1. Windows.Forms.Application.Exit()

    abgeändert werden musste.
    @'VB1963
    wenn ich die Endung

    VB.NET-Quellcode

    1. .OfType(Of TextBox)

    weglasse und die Groupbox entferne sind die Werte für i und oCellPosition.Value jeweils 1.
    Bei der anderen Variante haben die Variablen keine Werte.

    Gruß
    KlaKa

    KlaKa schrieb:

    Bei der anderen Variante haben die Variablen keine Werte.
    ...und das ist halt deine Erscheinung, dass die TextBoxen leer bleiben, weil diese Zeile nicht abgearbeitet wird...
    Woher stammen i und oCellPosition und was haben diese für einen Zweck bzw. tun diese? (kommt aus den gezeigten Codeteilen halt nicht heraus)
    @KlaKa Ich hätte den Hinweis mit dem Haltepunkt auch ignoriert.
    Willkommen im Club derf Ignoranten. :thumbdown:
    Was nützt es, wenn Du hier alle Vorschläge per C&P in Deinen Quelltext reinholst und Du dabei den Überblick total verlierst?
    Und wenn es dann rarsächlich laufen sollte, weißt Du nicht mal warum. :/
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!