| |

VB.NET - Ein- und UmsteigerCollections vb 2008 | |  | Autor: mawu5007 | Datum: 20.03.21 15:29 |
| ich erstellte ein kleines pgm für Benutzung eines Collections:"clscustomer"
Public Class clscustomer
Public NameValue As String
Public VornameValue As String
Public Property get_name() As String
Get
Return NameValue
End Get
Set(ByVal value As String)
NameValue = value
End Set
End Property
Public Property get_Vorname() As String
Get
Return VornameValue
End Get
Set(ByVal value As String)
VornameValue = value
End Set
End Property
End Class
-------------------------------------------
Public Class Form1
Public clscustomer As New Collection
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim addcustomer As New clscustomer
Dim readcustomer As New clscustomer
Dim i, count As Long
i = 1
addcustomer.get_name = "Müller"
addcustomer.get_Vorname = "Hans"
clscustomer.Add(addcustomer)
'WriteLine(clscustomer.Item(i))
i = 2
addcustomer.get_name = "Schulze"
addcustomer.get_Vorname = "Gert"
clscustomer.Add(addcustomer)
count = clscustomer.Count
readcustomer = CType(clscustomer.Item(1), clscustomer)
MessageBox.Show("Name: " + readcustomer.get_name + _
"; Vorname: " + readcustomer.get_Vorname)
readcustomer = CType(clscustomer.Item(2), clscustomer)
MessageBox.Show("Name: " + readcustomer.get_name + _
"; Vorname: " + readcustomer.get_Vorname)
End
End Sub
End Class
Es funktioniert aber:
Warum wird mir nur der letzte Name= Schulze angezeigt?
Es werden nicht beide Namen gespeichert.
Danke.
mfg |  |
Re: Collections vb 2008 | |  | Autor: dj.tommy | Datum: 20.03.21 16:59 |
| Hallo mawu5007!
Ich würde vorschlagen das du es so machst
Public Class Form1
Public clscustomer() As clscustomer
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles MyBase.Load
ReDim clscustomer(0) 'Erste erstellen
clscustomer(0) = New clscustomer
clscustomer(0).get_name = "Müller"
clscustomer(0).get_Vorname = "Hans"
ReDim Preserve clscustomer(1) 'Weitere erstellen
clscustomer(1) = New clscustomer
clscustomer(1).get_name = "Schulze"
clscustomer(1).get_Vorname = "Gert"
MessageBox.Show("Name: " + clscustomer(0).get_name + "; Vorname: " + _
clscustomer(0).get_Vorname)
MessageBox.Show("Name: " + clscustomer(1).get_name + "; Vorname: " + _
clscustomer(1).get_Vorname)
End
End Sub
End Class
Public Class clscustomer
Public NameValue As String
Public VornameValue As String
Public Property get_name() As String
Get
Return NameValue
End Get
Set(ByVal value As String)
NameValue = value
End Set
End Property
Public Property get_Vorname() As String
Get
Return VornameValue
End Get
Set(ByVal value As String)
VornameValue = value
End Set
End Property
End Class |  |
Re: Collections vb 2008 | |  | Autor: mawu5007 | Datum: 20.03.21 17:12 |
| Danke.
Ich baue es ein und melde mich "gleich" ca. 20 min. wieder.
mfg |  |
Re: Collections vb 2008 | |  | Autor: mawu5007 | Datum: 20.03.21 17:23 |
| Das gibt Fehlermeldungen: kann nicht in VB konvertriert werden
clscustomer(0) = New clscustomer
clscustomer(0).get_name = "Müller" |  |
Re: Collections vb 2008 | |  | Autor: dj.tommy | Datum: 21.03.21 16:11 |
| Hallo mawu5007!
Ich habe gestern noch getestet bei mir hat es aber funktioniert.
Was für eine Fehlermeldung gibt er aus? |  |
Re: Collections vb 2008 | |  | Autor: mawu5007 | Datum: 21.03.21 18:03 |
| Hallo dj.tommy
Zuerst einmal Danke für Ihre Antwort!
ich habe heute auf ArrayList umgestellt s.u..
Das funktioniert.
-------------------------------------------------------------------
Public Class Personen
Implements IComparable
Public Name As String
Public Vorname As String
Public GebDat As Date
Public ZSchalter As String
Public Sub New(ByVal _name As String, ByVal _vorname As String, ByVal _gebdat As Date, ByVal _schalter As String)
Me.Name = _name
Me.Vorname = _vorname
Me.GebDat = _gebdat
Me.ZSchalter = _schalter
End Sub
Public Function compareTo(ByVal obj As Object) As Integer Implements IComparable.CompareTo
' Sortieren (nach "Name/ etc") vorbereiten
If ZSchalter = "N" Then
Return Me.Name.CompareTo(DirectCast(obj, Personen).Name)
End If
If ZSchalter = "V" Then
Return Me.Vorname.CompareTo(DirectCast(obj, Personen).Name)
End If
End Function
End Class
----------------------------------------------------------------------
Public Class ArrayList
Public ZSchalter As String
Private Sub ArrayList_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim Person As New Collections.ArrayList()
'Sortieren nach "name/ etc"
ZSchalter = "N"
Person.Add(New Personen("Müller", "Hans", Date.Now, ZSchalter))
Person.Add(New Personen("Schulze", "Gert", Date.Now, ZSchalter))
Person.Add(New Personen("Hallo", "", Date.Now, ZSchalter))
Person.Sort()
End
End Sub
End Class
-------------------------------------------------------------------
mfg |  |
Re: Collections vb 2008 | |  | Autor: mawu5007 | Datum: 21.03.21 21:19 |
| DerSort läuft ohne Fehlermeldung aber die SortReihenfolge kann ich nicht verändern. |  |
Re: Collections vb 2008 | |  | Autor: mawu5007 | Datum: 22.03.21 16:55 |
| Ich bedanke mich nochmals bei dj.tommy für seine Arbeit.
Ich entwickelte jetzt ein funktionsfähiges Pgm nach Vorbild von
https://www.youtube.com/watch?v=1p4iHGWt-XM
also Collections mit ArrayList + Sort und stelle es hier aus:
--------------------------------------------------------------------------------
Public Class Personen
Implements IComparable
Public Name As String
Public Vorname As String
Public GebDat As Date
Public ZSchalter As String
Public Sub New(ByVal _name As String, ByVal _vorname As String, ByVal _gebdat As Date, ByVal _schalter As String)
Me.Name = _name
Me.Vorname = _vorname
Me.GebDat = _gebdat
Me.ZSchalter = _schalter
End Sub
Public Function CompareTo(ByVal obj As Object) As Integer Implements System.IComparable.CompareTo
' Sortieren (nach "Name/ etc") vorbereiten
If ZSchalter = "N" Then
Return Me.Name.CompareTo(DirectCast(obj, Personen).Name)
End If
If ZSchalter = "V" Then
Return Me.Vorname.CompareTo(DirectCast(obj, Personen).Vorname)
End If
End Function
End Class
--------------------------------------------------------------------
Public Class Form1
Public ZSchalter As String
Private Sub ArrayList_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim Person As New Collections.ArrayList()
'Sortieren nach "name/ vorname etc"
ZSchalter = "V"
Person.Add(New Personen("Müller", "Hans", Date.Now, ZSchalter))
Person.Add(New Personen("Schulze", "Gert", Date.Now, ZSchalter))
Person.Add(New Personen("Adam", "", Date.Now, ZSchalter))
Person.Add(New Personen("Hallo", "", Date.Now, ZSchalter))
If ZSchalter = "N" Then
Dim name_sort As IComparer = New SortPersonName
End If
If ZSchalter = "V" Then
Dim vorname_sort As IComparer = New SortPersonVorName
End If
Person.Sort()
End
End Sub
Class SortPersonName
Implements IComparer
Public Function compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
Dim person1 As Personen = DirectCast(x, Personen)
Dim person2 As Personen = DirectCast(y, Personen)
Return person1.Name.CompareTo(person2.Name)
End Function
End Class
Class SortPersonVorName
Implements IComparer
Public Function compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
Dim person1 As Personen = DirectCast(x, Personen)
Dim person2 As Personen = DirectCast(y, Personen)
Return person1.Vorname.CompareTo(person2.Vorname)
End Function
End Class
End Class
----------------------------------------------------------------------
mfg |  |
Vorschlag zur Verwendung der Framework-Angebote | |  | Autor: Manfred X | Datum: 02.04.21 11:54 |
| Für typsicheren Code stehen in System.Collections.Generic geeignete
Listen-Klassen zur Verfügung.
Um eine Klasse nach verschiedenen Kriterien vergleichen und
sortieren zu können, ist ein separater Comparer zweckmäßig.
Falls möglich, sollten Sortier-Vergleiche ein eindeutiges Ergebnis
liefern (z.b. hierarchisch)
Public Class Person
'Properties mit Defaultwerten z.B. um Nothing zu vermeiden
Public Property Name As String = ""
Public Property Vorname As String = ""
Public Property GebDat As Date = DateTime.MinValue
Public Sub New()
'parameterfreier Konstruktor für Default-Instanz
End Sub
Public Sub New(ByVal name As String, ByVal vorname As String, ByVal _
gebdat As Date)
Me.Name = name
Me.Vorname = vorname
Me.GebDat = gebdat
End Sub
End Class
'Sortierkriterien-Aufzählung
Public Enum PersonCompareEnum As Integer
Name
Vorname
Geburtsdatum
End Enum
'Parametrisierter Comparer zum (hierarchischen) Vergleichen und Sortieren
' von Personen
Public Class PersonComparer
Implements IComparer(Of Person)
Public Property CompareProperty As PersonCompareEnum = _
PersonCompareEnum.Name
Public Property CompareOrder As Windows.Forms.SortOrder
Public Function Compare(x As Person, y As Person) As Integer
Implements IComparer(Of Person).Compare
Dim c_name, c_vorname, c_geb, c As Integer
'Klassen-Properties einzeln vergleichen
c_name = x.Name.CompareTo(y.Name)
c_vorname = x.Vorname.CompareTo(y.Vorname)
c_geb = x.GebDat.CompareTo(y.GebDat)
'Hierarchischer Vergleich nach CompareProperty
Select Case CompareProperty
Case PersonCompareEnum.Name
c = getSortOrder(c_name, c_vorname, c_geb)
Case PersonCompareEnum.Vorname
c = getSortOrder(c_vorname, c_name, c_geb)
Case PersonCompareEnum.Geburtsdatum
c = getSortOrder(c_geb, c_name, c_vorname)
Case Else
Throw New NotImplementedException()
End Select
'Vergleichsrichtung einbeziehen
If CompareOrder = SortOrder.Descending Then
c *= -1
End If
'Vergleichsergebnis
Return c
End Function
Private Function getSortOrder(a As Integer, b As Integer, c As Integer) _
As Integer
'Aus Einzelvergleichen den Gesamtvergleich erstellen
Dim r As Integer = a
If r = 0 Then r = b
If r = 0 Then r = c
Return r
End Function
End Class
'Beispiel:
'Eine Zugriffsvariable auf eine Liste von Personen
Dim Personen As List(Of Person)
Private Sub Demo()
'Eine Liste erstellen und füllen (Nutzung der Defaultinstanz bei NEW)
Personen = New List(Of Person)
Personen.Add(New Person With
{.Name = "Müller", .Vorname = "Hans",
.GebDat = New DateTime(2010, 5, 18)})
Personen.Add(New Person With
{.Name = "Schulze", .Vorname = "Gert",
.GebDat = New DateTime(1995, 12, 24)})
Personen.Add(New Person With
{.Name = "Adam", .Vorname = "Hans",
.GebDat = New DateTime(1995, 11, 2)})
Personen.Add(New Person With
{.Name = "Adam", .Vorname = "Hans",
.GebDat = New DateTime(1995, 11, 4)})
'Die Liste fallend sortieren nach Vorname (incl. Name/Geburt)
Personen.Sort(New PersonComparer With
{.CompareProperty = PersonCompareEnum.Vorname,
.CompareOrder = SortOrder.Descending})
For i As Integer = 0 To Personen.Count - 1
With Personen(i)
System.Diagnostics.Debug.WriteLine
(.Name & " " & .Vorname & " " & .GebDat.ToString)
End With
Next i
End Sub |  |
Re: Vorschlag zur Verwendung der Framework-Angebote | |  | Autor: mawu5007 | Datum: 02.04.21 15:33 |
| Guten Tag,
vielen Dank für Ihre Arbeit.
Ich muss diese übernehmen und testen.
mfg |  |
 | Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
  |
|
TOP Entwickler-Paket 
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR...
Jetzt nur 599,00 EURWeitere Infos
Tipp des Monats April 2021 Dieter OtterPopUp-Menü wird nicht angezeigt :-(In diesem Tipp verraten wir Ihnen, wie Sie Probleme mit PopUp-Menüs umgehen können, wenn diese unter bestimmten Umständen einfach nicht angezeigt werden. Neu! sevCommand 4.0 
Professionelle Schaltflächen im modernen Design!
Mit nur wenigen Mausklicks statten auch Sie Ihre Anwendungen ab sofort mit grafischen Schaltflächen im modernen Look & Feel aus (WinXP, Office, Vista oder auch Windows 8), inkl. große Symbolbibliothek. Weitere Infos |