HDSoftware Skrevet 15. februar 2007 Skrevet 15. februar 2007 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
Jonas Skrevet 16. februar 2007 Skrevet 16. februar 2007 (endret) Jeg er ikke helt god på .Net, men jeg mener å huske at man kunne søke gjennom Arrays med IndexOf(array, value). Endret 16. februar 2007 av Jonas
aadnk Skrevet 16. februar 2007 Skrevet 16. februar 2007 (endret) 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 16. februar 2007 av aadnk
GeirGrusom Skrevet 16. februar 2007 Skrevet 16. februar 2007 Problemet med IndexOf er at den leter etter instansen av klassen, hvis ikke du bruker en ValueType (struct, int, char etc.) Du kan bruke Find, men den fungerer litt annerledes en man skulle tro.
HDSoftware Skrevet 21. februar 2007 Forfatter Skrevet 21. februar 2007 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
aadnk Skrevet 21. februar 2007 Skrevet 21. februar 2007 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.
HDSoftware Skrevet 22. februar 2007 Forfatter Skrevet 22. februar 2007 Takker for alle innlegg. Er det en enkel måte å binne denne liste opp mot en list kontroll? Ole
aadnk Skrevet 23. februar 2007 Skrevet 23. februar 2007 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
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå