Combo-Box Erster Eintrag, Typenkonvertierung, Msg-Box mit schließen

  • VB.NET

Es gibt 46 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Julia schrieb:

    eine Idee
    wäre, debuggen zu lernen, gugst Du hier.
    Du musst Dich selbst davon überzeugen, dass Dein Code das macht, was er machen soll.
    Mach z.B. eine spezielle Testvorgabe, z.B. "Roulade mit Klößen", und verfiolge, was mit dieser Vorgabe passiert, ob sie da ankommt, wo Du sie auswertest.
    Wenn nicht, hast Du einen Fehler gefunden.
    Leider glauben immer noch sehr viele Anfänger, dass Code, der compilierbar ist, auch richtig sei, doch das ist ein Irrglaube. 8o
    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!

    VB.NET-Quellcode

    1. For Each ctl As Control In Controls
    2. If TypeOf ctl Is Label Then
    3. For i As Integer = 0 To 77
    4. If FahrwegMarkiert.Tag = "on" Then
    5. AuswahlFahrweg(i) = True
    6. ElseIf FahrwegMarkiert.Tag = "off" Then
    7. AuswahlFahrweg(i) = False
    8. End If
    9. Next
    10. End If
    11. Next

    was ist FahrwegMarkiert und wie erhält es seine Werte?
    Es werden auf jeden Fall hier nicht die LabelTags abgefragt, sondern immer der selbe Wert. Da passiert dann auch nicht viel.
    Ich tipp mal darauf, dass eine Verbindung zwischen FahrwegMarkiert und ctl bestehen soll. Tut sie aber nicht.
    Aber was macht der Code:
    1. Gehe alle Controls durch
    2. bei jedem (!) Label werden alle (!) AuswahlFahrweg-FeldItems entweder auf True oder False gesetzt, abhängig davon, wie der Tag von FahrwegMarkiert ist.
    => bei 64 Labels und 78 AuswahlFahrweg-FeldItems hast Du knapp 5000 Prüfungen und Zuweisungen. Ich glaube, dass das an dem vorbeigeht, was Du willst, schließlich werden die Werte der Vorrunden immer überschrieben. Das ist wie:

    VB.NET-Quellcode

    1. Dim INeedAnUmbrella = False
    2. For i = 0 To 10000
    3. INeedAnUmbrella = ItsRainingOnDay(i)
    4. Next

    die ersten 10000 Tage werden ausgewertet und der Wert von derselben Variable INeedAnUmbrella auf True oder False gesetzt. Aber für das Endergebnis zählt nur Tag(10000), da mit ihm die allerletzte Zuweisung an INeedAnUmbrella gemacht wird und danach der Wert von INeedAnUmbrella nicht mehr überschrieben wird. Da hätte man sich die 10000 Vorrunden auch sparen können. So auch bei Deinem (momentanen) Code.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

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

    @VaporiZed

    ja da fehlt wohl wieder was...

    ich habe mir jetzt deinen Quellcode den du zum markieren der Fahrwege gepostet hattest als Anhaltspunkt genommen, aber ich bekomme es so nicht hin. Hier mal der ganze Code dafür:

    VB.NET-Quellcode

    1. Private Sub ArrayFahrweg(sender As Object, e As EventArgs) ''''''''''''''''''''''''ARRAY MUSS NOCH ERZEUGT WERDEN
    2. FahrwegMarkiert = DirectCast(sender, Label)
    3. For Each ctl As Control In Controls
    4. If TypeOf ctl Is Label Then
    5. For i As Integer = 0 To 77
    6. If FahrwegMarkiert.Tag = "on" Then
    7. AuswahlFahrweg(i) = True
    8. ElseIf FahrwegMarkiert.Tag = "off" Then
    9. AuswahlFahrweg(i) = False
    10. End If
    11. Next
    12. End If
    13. Next
    14. End Sub
    15. #End Region


    Die Tag-Eigenschaft wird bei Änderung der Farbe mit geändert, also Fahrweg markiert -> Tag Eigenschaft = "on"

    ich wollte also jedes Label Abfragen und dann die ganzen "Ons" und "Offs" in ein Array schreiben. Wie du schon sagtest, gibt er mir allerdings nur das letzte aus. Ich brauche dieses Array, weil ich es in einer anderen Form wieder verwenden will (Array auslesen und die Farbe der Labels je nach Tag-Eigenschaft ändern).
    Langsam. Private Sub ArrayFahrweg(sender As Object, e As EventArgs) ist wohl Dein EventHandler für das Klickereignis aller Labels, richtig? Dann stellt sich die Frage, warum Du bei jedem einzelnen Labelklick das komplette AuswahlFarhweg-Feld immer komplett neu zuordnest. Overkill.
    Die Zeilen 4 bis 14 gehören in eine Auswertungssub, die z.B. hinter einem Button "Fahrweg abspeichern" oder so gehört. Oder sie wird aufgerufen, wenn eine andere Form aufgerufen wird. Aber nicht jedes mal, wenn eine Fahrwegkachel ihre Farbe ändert.
    Fahrweg sollte ein Array sein, welches ganz zum Anfang der FahrwegMarkierenFormklasse deklariert werden soll. Im einfachsten (ggf. aber nicht auf Dauer als bequemster) Fall:

    VB.NET-Quellcode

    1. Public Class DerNameDeinerFahrwegauswahlform
    2. Dim AuswahlFahrweg As Boolean(77) = Nothing 'warum eigentlich 77? Ich dachte, es gibt nur 64 Felder.

    Da eine For-Each-Schleife nicht zwangsläufig daran gebunden ist, die Elemente in der Weise durchzugehen, von der Du annimmst, dass sie richtig ist, wäre es eigentlich noch sicherer, wenn die Tag-Eigenschaft der Feldlabels aus dem Zustand und dem Labelindex bestehen, die z.B. durch ein Komma getrennt sind, also "42,on". Dann kannst Du in Deinem Label-Click-EventHandler, an den alle Labels ihr Click-Event mitteilen, die on/off-Eigenschaft setzen und später bei der Auswertungssub genau feststellen, welches Label mit welchem Index welchen Zustand hat.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed

    eigentlich sollte das auch nur einmal durchlaufen werden, wenn alle Clicks durchgeführt wurden. Das Ganze extra zu packen, ist natürlich mehr als sinnvoll. Ich werde das in die nachfolgende Form auslagern, damit es nur einmal durchlaufen wird. Zu deiner Frage, ich habe in der Form die 64 Quadrate, welche ich Abfragen will, aber die gesamte Form hat 77 Labels. Ich wüsste nicht, wie ich diese zusätzlichen Labels umgehen kann, so dass diese gar nicht erst abgefragt werden.

    Das die Tag-Eigenschaft aus Label-Index und Zustand bestehen sollten macht Sinn, danke dafür! Kann ich denn (wenn ein Label zum Beispiel 42 heißt) das ,on noch hinzufügen ohne den Index zu ändern?

    Julia schrieb:

    Tag
    ist ein Object.
    Wenn Du der Tag-Property im Designer was zuweist, isses ein String.
    Machst Du das in Deinem Programm, isses das, was Du da halt zuweist.
    Wichtig ist, dass Du das korrekt zurück konvertierst. Dann kannst Du das reinschreiben was immer Du benötigst.
    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!
    @Julia:

    Julia schrieb:

    For i As Integer = 0 To 77
    [...]
    AuswahlFahrweg(i) = True
    und

    Julia schrieb:

    77 Labels
    sind zwei unterschiedliche Sachen. "AuswahlFahrweg" bezieht sich ja nur auf die klickbaren, bunten Labels, daher brauchst Du für "AuswahlFahrweg" auch nur insgesamt 64 Einträge. Zum anderen: Vorsicht bei nullbasierten Indizes. Wenn Du 77 Label hast und die alle durchgehen willst, musst Du von 0 bis 76 (!) in einer For-Schleife zählen.

    Wie RfG schon beschrieb: Wenn Du zur Laufzeit was ändern willst, schnapp Dir im Programmcode ein Label-Tag, rufe die ToString-Methode auf und mach daraus, was immer du brauchst (das Text-wieder-ans-Tag-Zurückgeben nicht vergessen ;) )

    kurzes Beispiel für die Fahrwegzusammenfassungs-Sub:

    VB.NET-Quellcode

    1. Dim CurrentArrayIndex = 0
    2. For Each ctl As Control In Controls
    3. If TypeOf ctl IsNot Label OrElse ctl.Tag Is Nothing Then Continue For
    4. AuswahlFahrweg(CurrentArrayIndex) = ctl.Tag.ToString().Contains("on")
    5. CurrentArrayIndex += 1
    6. Next


    oder besser noch (von wegen For-Each-Schleifenreihenfolge könnte unsicher sein):

    VB.NET-Quellcode

    1. Dim CurrentArrayIndex = 0
    2. For Each ctl As Control In Controls
    3. If TypeOf ctl IsNot Label OrElse ctl.Tag Is Nothing Then Continue For
    4. CurrentArrayIndex = CInt(ctl.Tag.ToString.Split(",")(0)) 'setzt voraus, dass die Tags mit z.B. "42,on" beschriftet sind
    5. AuswahlFahrweg(CurrentArrayIndex) = ctl.Tag.ToString().Contains("on")
    6. Next

    Für letzteres Codebeispiel müssen die anklickbaren Labeltags auch nullbasiert beschriftet sein, gehen dann also von 0-63
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „VaporiZed“ ()