none
VB2017: List (of ... ) Eintrag bearbeiten RRS feed

  • Frage

  • Hallo Forum,

    Ich habe eine List (of ..) mit eigener structure.

    Ich prüfe jetzt bei jedem Funktionsaufruf, ob der übergebene String "Looser" schon in der Liste drinsteht. Wenn nicht, soll er eingetragen werden, wenn er gefunden wird (kann max. 1x passieren) soll der gefundene Eintrag geändert werden. Der "Platz" bleibt gleich, es soll nur der Wert für SName durch Looser ersetzt werden.

    Ich habe schon wieder zig Versuche hinter mir, aber komme einfach nicht auf die richtige Lösung. Wäre toll, wenn mir jemand auf die Sprünge helfen könnte. Das ist der code, den ich schon habe...

    Private Structure MyDoubleStringStruct 
       Dim Box As String 
       Dim SName As String 
    End Structure 
    Dim tmpPlatzierung As New List(Of MyDoubleStringStruct) 
    
    Public Sub (Platzierung16(Platz As Integer, Looser As String) 
       Dim tnpPla as MyDoubleStringStruct = Nothing 
    
       If Looser = "FREILOS" THEN 
          Exit Sub 
       End If
       
       tnpPla.Box = Platz 
       tnpPla.SName = Looser 
    
    Dim Mysearch = From mydoublestringstruct As MyDoubleStringStruct In tmpPlatzierung Where mydoublestringstruct.SName = Looser 
    
    If Mysearch.Count = 0 Then 
       tmpPlatzierung.Add(tnlPla) 
    Else 
       'Hier den neuen Wert Looser an die Stelle Platz schreiben! 
    End If
    
    

    LG Micha

    Montag, 18. Juni 2018 07:41

Antworten

  • Das funktioniert auch soweit, nur verhält sich das bei mir so, dass er bei gefundenem Looser einen neuen Eintrag VOR dem gefundenen Eintrag erstellt mit dem korrekten Wert aus Platz, der dann doppelt in der Liste ist. 

    //EDIT: Fehler gefunden, da ich ja 2 Radiobuttons in einem Panel habe und ich im checked_change ereignis die Platzierung aufrufe, wird zuerst der ausgewählte Radiobutton übergeben und anschließend noch der neu gesetzte.

         Private Sub Sp13_1_CheckedChanged(sender As Object, e As EventArgs) Handles Sp13_1.CheckedChanged
                If Sp13_1.Checked Then S34.Text = S25.Text.ToString
                Call Platzierung16(Microsoft.VisualBasic.Strings.Right(Sp13_1.Parent.Name, Len(Sp13_1.Parent.Name) - 5), S26.Text.ToString)
                       End Sub
            Private Sub Sp13_2_CheckedChanged(sender As Object, e As EventArgs) Handles Sp13_2.CheckedChanged
                If Sp13_2.Checked Then S34.Text = S26.Text.ToString
                Call Platzierung16(Strings.Right(Sp13_2.Parent.Name, Len(Sp13_2.Parent.Name) - 5), S25.Text.ToString)
                End Sub
    Oh man, kann man das irgendwie umgehen? 

    Montag, 18. Juni 2018 14:37
  • Hi,

    warum "musst" du das umgehen? Du hast doch den Checked-Status. Kannst du damit nicht unterscheiden, was passieren soll?

    Gruß


    Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP

    Mittwoch, 20. Juni 2018 20:02

Alle Antworten

  • Hi Micha,

    also nochmal zum Verständnis:

    Du suchst in der Liste, die aus einer Struktur besteht, nach dem übergebenen Parameter Looser. Wenn dieser nicht gefunden wird, wird ein neuer Eintrag in die Liste erstellt, ok. Wenn er gefunden wird, soll er durch den Parameter Looser ersetzt werden..... ?!? Du willst also den gefundenen SName = Looser durch Looser ersetzen.........

    Vielleicht verstehe ich es auch nicht..

    Public Class Test
        Public Class MyDoubleStringStruct
            Public Box As Integer
            Public SName As String
        End Class
    
        Dim tmpPlatzierung As New List(Of MyDoubleStringStruct)
    
        Public Sub Platzierung16(Platz As Integer, Looser As String)
            Dim tnpPla As MyDoubleStringStruct = New MyDoubleStringStruct()
    
            If Looser = "FREILOS" Then
                Exit Sub
            End If
    
            tnpPla.Box = Platz
            tnpPla.SName = Looser
    
            Dim query = tmpPlatzierung.Where(Function(x) x.SName = Looser).FirstOrDefault()
    
            If query IsNot Nothing Then
                query.SName = "Looser" ' Oder was auch immer du möchtest...
            Else
                tmpPlatzierung.Add(tnpPla)
            End If
    
        End Sub
    
    End Class

    Allerdings funktioniert Struct so nicht mehr, ich habe diese durch eine Klasse ersetzt.

    Weiter hast du Box in deiner Struktur als String deklariert, möchtest aber in deiner Prozedur einen Integer übergeben. 

    Gruß


    Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP


    Montag, 18. Juni 2018 09:04
  • Hallo Stefan,

    Ja ein bisschen unverständlich.

    In folgendem Spielplan werden Namen eingetragen. Der Gewinner eines Spiels wird durch einen klick auf den Radiobutton neben dem Namen an die Funktion Platzierung16() übergeben. Für den Parameter Platz wird die PanelNummer (im grauen Kästchen) an die Funktion übergeben.

    Ich muss jetzt prüfen, ob der Name schon in der Liste ist. Wenn das der Fall ist (tritt auf, wenn man sich z.B. bei der Auswahl des Gewinners vertan hat und erneut innerhalb des gleichen Panels den anderen Radiobutton aktiviert, also flip/flop spielt sozusagen), soll der übergebene Name an die gleiche Stelle der Panel-Nummer geschrieben werden. Ich hoffe das war jetzt ein bisschen deutlicher....

    LG Micha

    Spielplan

    In deinem Beispiel oben wird in der Liste ein neuer eintrag mit dem gleichen "Platz" erzeugt und einem anderen Namen. Ich versuche, bei dem Eintrag mit der "Platz"-Nr den Eintrag in "SName" zu ersetzen.

    Beispiel für Panel 13-15 (13=Bine;Susanne, 14=Franz;Klaus, 15=Hans;Werner)

    13 Bine

    14 Franz

    15 Hans

    Jetzt wird in Panel 14 der Radiobutton von Franz auf Klaus gesetzt, dann sollte in der Liste stehen

    13 Bine

    14 Klaus

    15 Hans

    • Bearbeitet MKnost Montag, 18. Juni 2018 11:36
    Montag, 18. Juni 2018 11:16
  • Also in meinem Beispiel wird ein neuer Eintrag erzeugt, wenn der Name nicht gefunden wird. Und zwar mit den Parametern Platz und Looser.

    Wenn der Name gefunden wird (SName = Looser), wird der SName geändert. Womit war mir bei deiner ursprünglichen Frage nicht klar.

    Das war nach meinem Verständnis deine Frage, oder?

    Gruß


    Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP

    Montag, 18. Juni 2018 12:15
  • Das funktioniert auch soweit, nur verhält sich das bei mir so, dass er bei gefundenem Looser einen neuen Eintrag VOR dem gefundenen Eintrag erstellt mit dem korrekten Wert aus Platz, der dann doppelt in der Liste ist. 

    //EDIT: Fehler gefunden, da ich ja 2 Radiobuttons in einem Panel habe und ich im checked_change ereignis die Platzierung aufrufe, wird zuerst der ausgewählte Radiobutton übergeben und anschließend noch der neu gesetzte.

         Private Sub Sp13_1_CheckedChanged(sender As Object, e As EventArgs) Handles Sp13_1.CheckedChanged
                If Sp13_1.Checked Then S34.Text = S25.Text.ToString
                Call Platzierung16(Microsoft.VisualBasic.Strings.Right(Sp13_1.Parent.Name, Len(Sp13_1.Parent.Name) - 5), S26.Text.ToString)
                       End Sub
            Private Sub Sp13_2_CheckedChanged(sender As Object, e As EventArgs) Handles Sp13_2.CheckedChanged
                If Sp13_2.Checked Then S34.Text = S26.Text.ToString
                Call Platzierung16(Strings.Right(Sp13_2.Parent.Name, Len(Sp13_2.Parent.Name) - 5), S25.Text.ToString)
                End Sub
    Oh man, kann man das irgendwie umgehen? 

    Montag, 18. Juni 2018 14:37
  • Hi,

    warum "musst" du das umgehen? Du hast doch den Checked-Status. Kannst du damit nicht unterscheiden, was passieren soll?

    Gruß


    Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP

    Mittwoch, 20. Juni 2018 20:02