List of mehrdimensional mit String-, Double- Boolean-Elementen

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von VB-and-Me.

    List of mehrdimensional mit String-, Double- Boolean-Elementen

    Guten Tag! Ich möchte gerne eine Liste mit unterschiedlichen Variablen (String,Long,Boolean...) erstellen. Ich dachte an die Erstellung einer eigenen Classe. Aber, was ich auch versuche, immer kommen Fehlermeldungen.

    Quellcode

    1. Option Explicit On
    2. Option Strict On
    3. Public Class Form1
    4. Public Class Pap
    5. Public Name As String
    6. Public Nenn As Long
    7. Public Proz As Double
    8. Public da As Boolean
    9. Public wo As String
    10. End Class
    11. Public E As Pap
    12. Private Sub Form1_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Activated
    13. Dim lstE As New List(Of Pap)
    14. For i = 0 To 2
    15. lstE(i).Name = "Name" + i.ToString ' Fehler beim compilieren
    16. lstE(i).Nenn = 1500 + i * 250 ' Fehler zur Laufzeit
    17. lstE(i).Proz = 2.45 + i * 0.2 ' Fehler zur Laufzeit
    18. Next
    19. For i = 0 To 2
    20. 'ListBox1.Items.Add(lstE(i)) '???
    21. 'ListBox1.Items.Add(lstE(i).Name + " " + lstE(i).Nenn.ToString) '???
    22. Next
    23. End Sub
    24. Private Sub Form1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Click
    25. End
    26. End Sub
    27. End Class

    Ist sowas überhaupt realisierbar; wenn ja, wie komme ich weiter?
    Schon mal Danke und einen schönen Sönntag!

    VB.NET-Quellcode

    1. For i = 0 To 2
    2. 'ListBox1.Items.Add(lstE(i)) '???
    3. 'ListBox1.Items.Add(lstE(i).Name + " " + lstE(i).Nenn.ToString) '???
    4. Next


    schreibe eine tostring funktion für deine klasse. füge das ganze so der listbox zu:

    VB.NET-Quellcode

    1. listbox1.datasource = lstE


    Edit: und wenn du die liste in einer schleife durchlaufen muss nutze die for-each schleife. geht damit super einfach^^
    Hallo, danke sehr für die rasche Antwort! Nun läuft das Programm schon, aber in der Liste steht i-mal das Gleiche.
    Warum??
    Danke auch für die anderen Ratschläge, ich werde versuchen, sie sobald wie möglich umzusetzen.

    Quellcode

    1. Option Explicit On
    2. Option Strict On
    3. Public Class Form1
    4. Public Class Pap
    5. Public Name As String
    6. Public Nenn As Long
    7. Public Proz As Double
    8. Public da As Boolean
    9. Public wo As String
    10. End Class
    11. Private Sub Form1_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Activated
    12. Dim lstE As New List(Of Pap)
    13. Dim pappe As New Pap
    14. lstE.Clear()
    15. For i = 0 To 3
    16. pappe.Name = "Name" & i.ToString
    17. pappe.Nenn = 1500 + i * 250
    18. pappe.Proz = 2.45 + i * 0.2
    19. lstE.Add(pappe)
    20. Next
    21. For i = 0 To lstE.Count - 1
    22. ListBox1.Items.Add(lstE(i).Name & " " & lstE(i).Nenn.ToString & " " & lstE(i).Proz.ToString)
    23. Next
    24. End Sub
    25. Private Sub Form1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Click
    26. End
    27. End Sub
    28. End Class
    Hallo, die Empfehlung von FreakJNS bereitet mir Kopfzerbrechen. Ich will ja nicht die ganze Liste nur als String-Variable speichern, sonst muss ich jedesmal bei Zahlen oder Boolean wieder zurückverwandeln. Ich habe eine Function all2String verfasst, aber das klappt nicht.
    Eine weitere Frage dazu: in der For Each-Schleife kann ich je einen Datensatz lstE erfassen, aber wie kann ich in einer solchen Schleife die einzelnen Variablen Name, Nenn, Proz ... ansprechen, um sie ggfls in einen String verwandeln zu können? Gibt es da eine andere Möglichkeit als die in meiner Function all2String?


    Quellcode

    1. Option Explicit On
    2. Option Strict On
    3. Public Class Form1
    4. Public Class Pap
    5. Public Name As String
    6. Public Nenn As Long
    7. Public Proz As Double
    8. Public da As Boolean
    9. Public wo As String
    10. End Class
    11. Private Sub Form1_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Activated
    12. Dim lstE As New List(Of Pap)
    13. lstE.Clear()
    14. For i = 0 To 3
    15. Dim pappe As New Pap
    16. pappe.Name = "Name" & i.ToString
    17. pappe.Nenn = 1500 + i * 250
    18. pappe.Proz = 2.45 + i * 0.2
    19. lstE.Add(pappe)
    20. Next
    21. For Each Element In lstE
    22. ListBox1.DataSource = all2String(Element) ' Meldung:Das komplexe DataBinding akzeptiert als Datenquelle entweder IList oder IListSource.
    23. 'ListBox1.Items.Add(c.Name & " " & c.Nenn.ToString & " " & c.Proz.ToString) ' das funktioniert
    24. Next
    25. End Sub
    26. Public Function all2String(ByVal c As Pap) As String
    27. all2String = c.Name & " " & c.Nenn.ToString & " " & c.Proz.ToString
    28. End Function
    29. Private Sub Form1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Click
    30. End
    31. End Sub
    32. End Class[code]
    33. [/co de]


    Vielen Dank!

    VB.NET-Quellcode

    1. for each bla as pap in lstE
    2. 'bla.name
    3. 'bla.nenn
    4. 'etc ist verfügbar
    5. next


    edit: du hast da ja die klasse pap. erstelle in ihr mal die funktion toString as string. muss overrides oder so sein, einfach mal ausprobieren^^
    dann kannst du die ganze schleife weglassen wenn du die lsite in der listbox anzeigen lassen willst.
    also statt

    VB.NET-Quellcode

    1. for each item as pap in listE
    2. listbox1.item.add(item.tostring)
    3. next


    kannst du direkt schreiben

    VB.NET-Quellcode

    1. listbox1.datasource = listE


    mehr nicht, das ist völlig ausreichend und erfordert nur die .tostring funktion^^
    btw, die alltostring funktion da ist genau das, was die .tostring funktion eigentlich macht, steht eben nur an falscher stelle.
    außerdem kommt ein fehler wenn du listbox1.datasoure = string setzt. es muss eine liste oder array sein. da du deine daten als list(of pap) vorliegen hast kannst du diese direkt übergeben. einzige vorraussetztung ist wie gesagt das pap eine tostring funktion hat, denn sonst weiß die listbox ja nicht wie sie die einzelnen items nennen soll.
    falls es fragen gibt einfach melden

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

    Guten Tag und herzlichen Dank für die z.T. noch mitternächtlich erstellten Hilfebeiträge!
    Ich komme einfach nicht voran. ?( ?(
    1. Wenn ich meine all2String-Funktion in die Class -Definition papp einfüge, wird sie doch noch nirgends aufgerufen, da muss wohl noch irgend etwas dazugeschrieben werden. Meine all2String-Funktion ermöglicht mir ja, dass die Ausgabe in der Listbox formatiert erscheint.
    2. Overrides: hier kommt eine Fehlermeldung : function "all2string" kann nicht als "Overrides" deklariert werden, da es function in Basis class nicht überschreibt.
    3. der Code Listbox1.Displaymember = "Name", wo soll er stehen und was soll als "Name" eingetragen sein. Es soll ja in der Listbox nicht nur die Variable .Name ausgegeben werden.
    Ich habe vieles ausprobiert, aber nur raten, hilft mir nicht weiter. Das ist für mich zu komplex.
    Ich danke allen für die Gedult.
    Mein Code sieht derzeit wie folgt aus:

    Quellcode

    1. Option Explicit On
    2. Option Strict On
    3. Public Class Form1
    4. Public Class Pap
    5. Public Name As String
    6. Public Nenn As Long
    7. Public Proz As Double
    8. Public da As Boolean
    9. Public wo As String
    10. Public Function all2string(ByVal c As Pap) As String
    11. all2string = c.Name.PadRight(10) & " " & c.Nenn.ToString & " " & c.Proz.ToString
    12. End Function
    13. End Class
    14. Private Sub Form1_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Activated
    15. Dim lstE As New List(Of Pap)
    16. lstE.Clear()
    17. For i = 0 To 3
    18. Dim pappe As New Pap
    19. pappe.Name = "Name" & i.ToString
    20. pappe.Nenn = 1500 + i * 250
    21. pappe.Proz = 2.45 + i * 0.2
    22. lstE.Add(pappe)
    23. Next
    24. For Each item As Pap In lstE ' das ergibt 4 gleiche unerwartete Einträge in de Liste : Listen01.Form1+pap
    25. ListBox1.Items.Add(item.ToString)
    26. Next
    27. 'For Each Element In lstE
    28. ' ' ListBox1.DisplayMember = "name"
    29. ' ' ListBox1.DataSource = lstE' Meldung:Das komplexe DataBinding akzeptiert als Datenquelle entweder IList oder IListSource.
    30. ' ListBox1.Items.Add(all2String(Element)) '(c.Name & " " & c.Nenn.ToString & " " & c.Proz.ToString)' das funktioniert !!!
    31. 'Next
    32. ' ListBox1.DataSource = lstE
    33. End Sub
    34. Private Sub Form1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Click
    35. End
    36. End Sub
    37. End Class



    Vielen Dank! Und einen schönen Tag!
    1) du musst die funktionen auch richtig benennen (=> tostring)^^
    2) 1 ausführen und dann wirst du sehen, dass die selbstgebastelte tostringfunktion ein overrides braucht
    3) okay, da muss ich passen. ich hab das selbst nicht hinbekommen. Werde dem auch nicht nachgehen, da ich lieber auf die tostring funktion zurückgreife aus gründen der anpassbarkeit

    habe den code mal angepasst. sollte selbsterkärend sein

    VB.NET-Quellcode

    1. Option Explicit On
    2. Option Strict On
    3. Public Class Form1
    4. Public Class Pap
    5. Public Name As String
    6. Public Nenn As Long
    7. Public Proz As Double
    8. Public da As Boolean
    9. Public wo As String
    10. Public Overrides Function tostring() As String
    11. Return Name.PadRight(10) & " " & Nenn.ToString & " " & Proz.ToString
    12. End Function
    13. End Class
    14. Private Sub Form1_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Activated
    15. Dim lstE As New List(Of Pap)
    16. lstE.Clear()
    17. For i = 0 To 3
    18. Dim pappe As New Pap
    19. pappe.Name = "Name" & i.ToString
    20. pappe.Nenn = 1500 + i * 250
    21. pappe.Proz = 2.45 + i * 0.2
    22. lstE.Add(pappe)
    23. Next
    24. ''der code läuft durch die änderung einwandfrei, kann aber verinfacht werden
    25. 'For Each item As Pap In lstE
    26. ' ListBox1.Items.Add(item.ToString)
    27. 'Next
    28. 'und zwar so:
    29. ListBox1.DataSource = lstE
    30. End Sub
    31. End Class



    noch dazu wäre zu sagen, dass du die tostring funktion etwas verbessern kannst:
    nehmen wir an, du schreibst reale namen wie Klaus, Sam oder Johannes in die variablen. du siehst, dass diese unterschiedlich lang sind und das würde die Tabellenform der listbox zerstören^^
    du musst also eine bestimmte anzahl von leerzeichen hinter den namen erzeugen.

    PadRight-Funktion kannte ich noch garnicht...
    jetzt hab ich was von dir gelernt xD

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „FreakJNS“ ()

    VB-and-Me schrieb:

    3. der Code Listbox1.Displaymember = "Name", wo soll er stehen
    du musstes halt machen, wie ich sage: einfach dazuschreiben. und mit dazu meine ich die zeile aus post#8:

    VB.NET-Quellcode

    1. listbox1.datasource = listE
    da - zu, also:

    VB.NET-Quellcode

    1. listbox1.datasource = listE
    2. listbox1.DisplayMember="Name"
    und was soll als "Name" eingetragen sein.
    Nix! genau "Name". Der String "Name" bezeichnet eine Property deiner PappenKlasse, und diese Property wird dann angezeigt.

    Es soll ja in der Listbox nicht nur die Variable .Name ausgegeben werden.
    Dann ists natürlich nicht ausreichend. Mittm DisplayMember kann man immer nur eine Property zur Anzeige bringen.
    Guten Tag!
    Ganz herzlichen Dank meinen beiden Betreuern, die so viel Gedult mit mir haben.
    Die tostring-Funktion in der Class-Definition verstehe ich nicht so recht. Die einzelnen Variablen Name, Nenn, Proz ... sind doch weiterhin als String, Long, Double abrufbar. 1. Wann also tritt diese toString -Funktion überhaupt in Aktion und warum, sie wird doch nirgends aufgerufen?

    Quellcode

    1. ListBox1.DataSource = lstE

    2. Könnte man sie eventuell auch noch bei anderen Gelegenheiten benützen?

    Quellcode

    1. Label1.Text = lstE(1).tostring

    funktioniert z.B. nun auch- aber nur, wenn diese tostring-Funktion in der Klasse steht.
    3. Kann man eventuell auch andere selbstverfasste Functionen in die Class-Definition schreiben? bei meinem all2string klappte das ja nicht.
    Vielen Dank nochmals und - trotz meiner Fragen - einen schönen Tag!
    :)
    hey.
    die tostring funktion ist ja wie du sicher schon gemerkt hast überall vertreten (integer.tostring, double.tostring, color.tostring, date.tostring). Sie ist auch bei deiner klasse von anfang an dabei (desswegen das overrides um die alte zu überschreiben). Die alte gibt nur blödsinn aus wie du ja schon gemerkt hast als du ganz am anfang (ohne eigene tostringfunktion) ListBox1.DataSource = lstE geschrieben hast. auf die funktion wird also "von alleine zugegriffen"
    wenn du die liste mittels datasource an die listbox übergibst weiß die listbox automatisch was zutun ist: es handelt sich um eine listenartige aufzählung (array, listof, dictionary sollte auch funsen,...). die listbox weiß, dass sie für die textdarstellung eines elements nur item.tostring aufrufen muss, denn das ist überall gleich.

    und für die zweite frage: richtig! das greift auch (offensichtlich^^) auf die .tostring funktion zu.
    es gibt da bestimmt noch weitere funktionen, z.b. die ganzen rechenoperatoren wie +-*/ oder vergleichsoperatoren die du einbauen kannst (ist für deine klasse wahrscheinlich nicht so relevant), dann schon eher eine sortierfunktion^^ die overridesfunktionen sind nach wie vor: equals, gethashcode und tostring