vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Zippen wie die Profis!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   RSS-Feeds  | Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2021
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Collections 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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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"
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2021 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel