Gå til innhold

Anbefalte innlegg

Heisan folkens

Har en liten greie her og ønsker en noe bedre måte å gjøre det på.

 

Jeg har en del llist(of ...) for å holde orden på relaterte poster. Se for dere en kundeliste med telefon lister, noe slik...

 

dim Kundeliste as list(of KundeClass)

Public Class KundeClass
 Public Kundenavn as String
 Public Telefonliste as list(of TelefonClass)
End Class

Public Class TelefonClass
 Public Nummer as String
End Class

Som dere ser vil dette gi en liste med kunder og telefon nummere. Problemet er jo å legge til nye poster, slette etc. F.eks. bør det jo være slik at jeg kan ha en metode som legger inn nummer. Jeg lurer på hvordan dere ville gjort det. FØlgende kode er noe ala det jeg bruker i dag, men jeg er sikker på at det må være enklere måter å gjøre dette på.

Public Sub NyttNummer(ByVal pNavn as String, ByVal pNummer as String)
 dim FunnetKunde as KundeClass = Nothing
 For each k as Kundeclass in me.Kundeliste
   if k.Kundenavn = pNavn
     FunnetKunde = k
     break
   End if
 End for
 if FunnetKunde is Nothing
   me.Kundeliste.Add(new KundeClass(pNavn))
   me.Kundeliste.TelefoListe.Add(new TelefonClass(pNummer)
 Else
   dim FunnetNummer as Boolean = False
   For each n as TelefonClass in FunnetKunde.Telefonliste
     if n.Nummer = pNummer then
       FunnetNummer = True
         exit for
       End if
     End for
     if FunnetNummer = False
       FunnetKunde.TelefonListe.Add(new TelefonClass(pNummer))
     End if
   Exit For
 End if
End Sub

Sikker noen trykkfeil her for koden er tatt ut av det blå

Som dere ser er dette rimelig tungvint, og jeg tenker jo med skrekk på de tilfellene der slike relasjoner er enda mere kompliserte. Som eksempel kan jeg jo nevne hvordan Clarion løser dette for å gi et perspektiv på hvor enkelt jeg mener slikt bør være, og jeg håper jo da at noen kan fortelle meg den gode nyheten at - joda, dette er like enkelt i VB :-)

 

NyttNummer   PROCEDURE(pNavn STRING, pNummer STRING)
 CODE
 Self.Kundeliste.Kundenavn = pNavn
 Get(Self.Kundeliste, Self.Kundeliste.Kundenavn)
 if Errorcode()
   Self.Kundeliste.Navn = pNavn
   Self.Kundeliste.Telefonliste &= new(TelefonClass)
   Add(Self.Kundeliste)
 End!if
 Self.Kundeliste.TelefonListe.Nummer = pNummer
 Get(Self.Kundeliste.TelefonListe, Self.Kundeliste.TelefonListe.Nummer)
 if Errorcode()
   Self.Kundeliste.TelefonListe.Nummer = pNummer
   Add(Self.Kundeliste.Telefonliste)
 End!if

 

Håper virkelig noen har et godt forslag her :-D

 

I korte trekk ønsker jeg med andre ord å erstatte FOR EACH løkka for å hente en post i lista.

 

mvh Ole

Lenke til kommentar
Videoannonse
Annonse

For å oppnå unik indeksering kan du bruke SortedList- eller Hashtable-klassene istedenfor List. Da blir koden mye lettere å skrive og langt mer oversiktlig:

Public Class Form1

 

    ' Liste over kunder

    Dim Customers As New SortedList(Of String, CustomerClass)

 

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

 

        AddNumber("Ole", "12345678")

        AddNumber("Ole", "98765432")

        AddNumber("Ole", "12345678")

        AddNumber("Kari", "12345678")

 

    End Sub

 

    Public Sub AddNumber(ByVal Name As String, ByVal Number As String)

 

        ' Dersom listen ikke allerede inneholder denne kunden, ...

        If Not Customers.ContainsKey(Name) Then

            ' ... lager vi en ny

            Customers.Add(Name, New CustomerClass(Name))

        End If

 

        ' Dersom denne kunden ikke allerede inneholder det gitte nummeret, ...

        With Customers(Name)

            If Not .Phonebook.ContainsKey(Number) Then

                ' ... legger vi det til i denne listen

                .Phonebook.Add(Number, New TelephoneClass(Number))

            End If

        End With

 

    End Sub

 

End Class

 

Public Class CustomerClass

    Public Customer As String

    Public Phonebook As New SortedList(Of String, TelephoneClass)

 

    ' Lager en ny instans av klassen

    Public Sub New(ByVal Name As String)

        Me.Customer = Name

    End Sub

End Class

 

Public Class TelephoneClass

    Public Number As String

 

    Public Sub New(ByVal Number As String)

        Me.Number = Number

    End Sub

End Class

Endret av aadnk
Lenke til kommentar
For å oppnå unik indeksering kan du bruke SortedList- eller Hashtable-klassene istedenfor List. Da blir koden mye lettere å skrive og langt mer oversiktlig:

 

Jaha.... Tror jeg skjønte den, men er et par ting alikevel...

 

Du definerer alså listen slik

dim liste as new sortedlist(of string, RecordClass)

Hvorfor denne stringen? Er det den som blir nøkkelen?

 

Må sjekke ut dette nærmere når jeg kommer på jobb i morgen

 

Takker

 

Ole

Lenke til kommentar
dim liste as new sortedlist(of string, RecordClass)

Hvorfor denne stringen?  Er det den som blir nøkkelen? 

7995016[/snapback]

Den delen av deklarasjonen definerer datatypen til nøkkelen (se Generics). Datatypene du kan benytte er heller ikke begrenset til String eller andre primitiver - du kan også bruke egendefinerte klasser såfremt de støtter de riktige funksjoner (GetHashCode for Hashtable) og grensesnitt (IComparable for SortedList). Evt., om disse klassene ikke har noen brukbar støtte for dette, kan du benytte henholdsvis IEqualityComparer (før 2.0: IHashCodeProvider) og IComparer til å overstyre standardoppførselen.

Lenke til kommentar
Takker for alle innlegg.  Er det en enkel måte å binne denne liste opp mot en list kontroll? 

 

Ole

8000679[/snapback]

Mja ... det enkleste her blir nok bare å fylle listekontrollen:

' Bemerk at listeboksen må ha to kolonner (Kunde og Telefonnummer). "View"

' må i tillegg være satt til "Details".

Public Sub FillUsingCustomers(ByVal Control As ListView, _

  ByVal List As SortedList(Of String, CustomerClass))

 

    ' Først - fjern alle tidligere elementer

    Control.Items.Clear()

 

    ' Legg så til alle elementer (i to kolonner)

    For Each Customer As CustomerClass In List.Values

        For Each Telephone As TelephoneClass In Customer.Phonebook.Values

            ' Legg til hovedelementet (kunden) og subelementet (telefonnummeret)

            With Control.Items.Add(Customer.Customer) ' Customer-egenskapen bør nok endres til Name

                .SubItems.Add(Telephone.Number)

            End With

        Next

    Next

 

End Sub

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...