Gå til innhold

Anbefalte innlegg

Heisann, jeg har laget et program som du kan hente ut og legge til elever ved en tenkt skole!

Dette fungerer fint og jeg kan ble i poster ved hjelp av fram og tilbake knapper.

Men jeg savner en søke funskjon, er det noen som vet hvordan jeg kan løse dette?

Har prøvd med en loop, men det vil ikke funke. Legger ved koden under!

 

 
Structure StudentPost
       <VBFixedString(30)> Public navn As String
       <VBFixedString(5)> Public klasse As String
       <VBFixedString(25)> Public epost As String
       <VBFixedString(10)> Public født As Date

   End Structure
   Private minStudent As StudentPost
   Const postlengde = 70
   Private antall As Integer
   Private posisjon As Integer
   Private filnummer As Integer

Private Sub bt_search_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bt_search.Click

Dim sok As String
       Dim teller As Integer
       sok = txt_search.Text
       teller = "0"
       posisjon = 1

       Do Until teller = "1"
           With minStudent
               If sok = .navn Then
                   txt_name.Text = .navn
                   txt_class.Text = .klasse
                   txt_email.Text = .epost
                   txt_born.Text = .født
                   teller = "1"
               Else
                   posisjon = posisjon + 1
                   MsgBox("error")
               End If
           End With
       Loop

   End Sub

Lenke til kommentar
  • 2 måneder senere...
Videoannonse
Annonse

Attributten VBFixedString, FileOpen, FileGet og FileClose ligger i Microsoft.VisualBasic og er først og fremst ment for å gjøre det mulig å automatisk oversette Visual Basic 6.0-programmer (du holder på med VB 7-10). Det er foretrukket at en bruker funksjoner i selve kjernen av .NET (System-navnerommet), men det er ikke i praksis et problem - VisualBasic-bakoverkompatibilitetslaget vil neppe bli fjernet fra .NET.

 

Et slikt postsystem har sine fordeler, blant annet unngår du å måtte legge all informasjonen i RAM-en og det er mulig å endre størrelsen av felter uten å måtte skrive hele filen på nytt, men en er også begrenset av støttede datatyper og den øvre størrelsen i feltene. Disse innsparingene var muligens relevante i VB sin barndom, men i dag vil det være bedre og enklere å bare ha all informasjonen lagret i minne og skrive det ut til disken ved programslutt. I dag blir dette først et problem når man snakker om tusenvis/millioner av poster, og da burde en for lengst gått over til et skikkelig databasesystem med indeksering (Microsoft SQL Server, MySQL, Oracle, ect.).

 

Men hvis antall poster er langt mindre enn dette, går det helt greit å åpne og lagre til en enkel filstruktur. I .NET er det lettest å oppnå dette med serialisering - nær automatisk konvertering fra objekter og til filer (gen. filstrømmer) og tilbake igjen. Dvs. at du kan lagre et objekt (eksempelvis en samling studenter) til en fil, og senere rekonstruerere dette objektet fra den samme filen.

 

Først, gjør om strukturen din til en klasse uten attributtene:

Public Class Student
   Public navn As String
   Public klasse As String
   Public epost As String
   Public født As Date
End Class

 

Deretter lager du et felt i formen (eller hovedklassen) som kan inneholde alle studentene. Det er også mulig å indeksere studentene slik at du f. eks. kan slå opp en student etter navn så som tallindeks:

 ' Dette er en array (som Dim s() As Students) som automatisk utvider seg '
Private studenter As New List(Of Student)

 

Merk at syntaksen ovenfor krever .NET 2.0 eller nyere. Hvis du bruker en eldre versjon, vil du få feilmelding og du må du erstatte List(Of Student) med ArrayList.

 

For å legge til en ny post, bruker du Add-metoden:

Dim nyStudent As New Student

With nyStudent
   .Navn = "Test"
   .Klasse = "Klasse"
   .Epost = "[email protected]"
   .Født = New Date(1990, 1, 1)
End With

Studenter.Add(nyStudent)

 

Hvis du bruker .NET 4.0 kan du gjøre dette i en linje (evt. med en konstruktør før 4.0):

studenter.Add(New Student With {
           navn = "Test",
           klasse = "Klasse",
           epost = "[email protected]",
           født = New Date(1990, 1, 1)}

 

For å endre en student, kan du modifisere feltene direkte med en indeks:

With studenter(0) ' første student '
   .navn = "nytt navn"
   .klasse = "ny kasse"
   ' ect, '
End With

 

Du bør også sjekke at indeksen er korrekt. Studenter.Count gir deg antall studenter i listen, hvor tallindeks 0 er første student og tallindeks Studenter.Count - 1 er siste student.

 

Du kan åpne å søke i listen på to måter - enten ved å indeksere studentene etter f.eks. navn (dette er raskere dersom du har veldig mange studenter), eller du kan gå gjennom hver enkelt student om gangen, som du har forsøkt å gjøre i koden ovenfor. Dette kan du eksempelvis gjøre med en For-løkke:

For i = 0 To studenter.Count - 1
   ' Det vi er ute etter '
   If studenter(i).navn = "Test" Then
       ' Last inn student etter gitt indeks '
       LoadStudent(i)
   End If
Next

MessageBox.Show("Feil. Ingen student med det navnet")

 

Hvis du har .NET 3.0 eller nyere, kan du bruke LINQ:

' Husk at LoadStudent-metoden må teste om indeksen er gyldig ' 
LoadStudent(studenter.FindIndex(Function(s) s.navn = "Test"))

 

 

Endelig, for å serialisere (lagre) en liste med studenter, gjør du følgende:

Try
   Using output As New IO.FileStream("data.dat", IO.FileMode.Create)
       ' Legg gjerne til Imports Runtime.Serialization.Formatters.Binary '
       Dim Formater As New Runtime.Serialization.Formatters.Binary.BinaryFormatter
       Formater.Serialize(output, studenter)
   End Using
Catch ex As Exception
   ' Vis feil '
   MessageBox.Show(ex.ToString)
End Try

 

For å åpne, gjør du som så:

If IO.File.Exists("data.dat") Then
   Try
       Using input As New IO.FileStream("data.dat", IO.FileMode.Open)
           ' Legg gjerne til Imports Runtime.Serialization.Formatters.Binary '
           Dim Formater As New Runtime.Serialization.Formatters.Binary.BinaryFormatter
           studenter = Formater.Deserialize(input)
       End Using
   Catch ex As Exception
       ' Vis feil '
       MessageBox.Show(ex.ToString)
   End Try
End If

Endret av aadnk
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å
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...