Benutzer mit den meisten Antworten
VB2017: List (of ... ) Eintrag bearbeiten

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
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?
- Bearbeitet MKnost Montag, 18. Juni 2018 15:03 update
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 25. Juni 2018 05:38
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 3. Juli 2018 12:47
-
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
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 25. Juni 2018 05:38
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 3. Juli 2018 12:47
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
- Bearbeitet Stefan Krömer Montag, 18. Juni 2018 09:07
-
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
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
-
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
-
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?
- Bearbeitet MKnost Montag, 18. Juni 2018 15:03 update
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 25. Juni 2018 05:38
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 3. Juli 2018 12:47
-
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
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 25. Juni 2018 05:38
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 3. Juli 2018 12:47