text doorzoeken met waarde die in textbox is ingegeven

Status
Niet open voor verdere reacties.

paulus4605

Gebruiker
Lid geworden
2 mrt 2013
Berichten
28
Beste,
Ik werk sinds 2 dagen met visual basic 2010.

Tot dusver heb ik het voor elkaar gekregen om een formulier in elkaar te zetten en vervolgens de gegevens van dit formulier weg te schrijven in een txt bestand.

Nu zou ik graag willen dat bij het ingeven van een klantnummer het bestaande textbestand doorzocht wordt om te kijken of dit klantnummer al bestaat en als er een lijn gevonden wordt met gegevens dat
dit wordt weergegeven door middel van een popup of text bestandje

Ik weet dat ik hiervoor streamreader moet gebruiken om het bestand in te lezen maar weet niet hoe ik van hieruit verder moet
kan iemand me opweg helpen?

alvast bedankt
hieronder de code die ik nu heb
Code:
Imports System.IO

Public Class frmTelelink

    Private Sub ComboBox1_DropDown(ByVal sender As Object, ByVal e As System.EventArgs) Handles CbxOS.DropDown
        CbxOS.Items.Add("Windows xp")
        CbxOS.Items.Add("Vista")
        CbxOS.Items.Add("Windows 7")
        CbxOS.Items.Add("Windows 8")
        CbxOffice.Items.Add("2003")
        CbxOffice.Items.Add("2007")
        CbxOffice.Items.Add("2010")
        CbxOffice.Items.Add("2013")
        CbxInstall.Items.Add("Standalone")
        CbxInstall.Items.Add("Network")
    End Sub



    Private Sub CmdAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdAdd.Click

        Dim writer As New StreamWriter(My.Computer.FileSystem.SpecialDirectories.MyDocuments & "\vbtest\textdata.txt", True)

        writer.Write(DateTimePicker1.Text & ";")
        writer.Write(CbxOS.Text & ";")
        writer.Write(IIf(Rb32Bit.Checked, "32", "64") & ";")
        writer.Write(CbxOffice.Text & ";")
        writer.Write(IIf(RadioButton1.Checked, "32", "64") & ";")
        writer.Write(CbxInstall.Text & ";")
        writer.Write(TxtVersion.Text & ";")
        writer.Write(TxtAdminUser.Text & ";")
        writer.Write(TxtContact.Text & ";")
        writer.Write(TxtPhone.Text & ";")
        writer.Write(TxtIsaSub.Text & ";")
        writer.Write(TxtRemarks.Text & ";")
        writer.WriteLine()

        writer.Dispose()
        writer.Close()
        If CbxOS.Text = "Windows 7" And Rb64Bit.Checked And CbxOffice.Text = "2010" And RbOf32bit.Checked Then
            MsgBox("this Configuration is not supported")
        End If

       

        'clear form
        Me.CbxOS.Text = ""
        Me.CbxOffice.Text = ""
        Me.CbxInstall.Text = ""
        Me.TxtVersion.Text = ""
        Me.TxtAdminUser.Text = ""
        Me.TxtIsaSub.Text = ""
        Me.TxtContact.Text = ""
        Me.TxtPhone.Text = ""
        Me.TxtRemarks.Text = ""




    End Sub

    Private Sub CmdClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdClose.Click
        Me.Close()
    End Sub

  
End Class

ik heb nu een manier gevonden om het text bestand in te lezen in een buffer
echter zou ik nu de regel waar de waarde van TxtAdminUser.Text of TxtIsaSub.Text in vermeld staat in een notepad of messagebox willen krijgen
kan iemand mij daarmee verder helpen

Code:
  Private Sub CmdAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdAdd.Click

        'controleren of gegevens zijn ingevuld
        If CbxOS.Text = "" Then
            MsgBox("Je dient een Operatingsystem in te vullen", MsgBoxStyle.Critical)
        End If
        If CbxOffice.Text = "" Then
            MsgBox("Office versie moet ingevuld zijn", MsgBoxStyle.Critical)
        End If
        If TxtVersion.Text = "" Then
            MsgBox("Telelink versie moet ingevuld zijn", MsgBoxStyle.Critical)
        End If
        If TxtAdminUser.Text = "" Then
            MsgBox("Je dient een userid in te vullen", MsgBoxStyle.Critical)
        End If
        If TxtIsaSub.Text = "" Then
            MsgBox("Je dient een abonnementsnummer in te vullen", MsgBoxStyle.Critical)
        End If
        If TxtPhone.Text = "" Then
            MsgBox("Telefoonnummer moet ingevuld zijn", MsgBoxStyle.Critical)
        End If
        'displays gegevens via sbuffer middels textbox regel per regem
        Dim sBuffer As String
        Using oReader As StreamReader = File.OpenText("D:\my documents\vbtest\textdata.txt")

            While Not (oReader.EndOfStream)
                sBuffer = oReader.ReadLine

                MsgBox(sBuffer)

            End While

        End Using
        'gegevens wegschrijven naar bestand
        Dim writer As New StreamWriter(My.Computer.FileSystem.SpecialDirectories.MyDocuments & "\vbtest\textdata.txt", True)

        writer.Write(DateTimePicker1.Text & ";")
        writer.Write(CbxOS.Text & ";")
        writer.Write(IIf(Rb32Bit.Checked, "32", "64") & ";")
        writer.Write(CbxOffice.Text & ";")
        writer.Write(IIf(RadioButton1.Checked, "32", "64") & ";")
        writer.Write(CbxInstall.Text & ";")
        writer.Write(TxtVersion.Text & ";")
        writer.Write(TxtAdminUser.Text & ";")
        writer.Write(TxtContact.Text & ";")
        writer.Write(TxtPhone.Text & ";")
        writer.Write(TxtIsaSub.Text & ";")
        writer.Write(TxtRemarks.Text & ";")
        writer.WriteLine()

        writer.Dispose()
        writer.Close()
        If CbxOS.Text = "Windows 7" And Rb64Bit.Checked And CbxOffice.Text = "2010" And RbOf32bit.Checked Then
            MsgBox("this Configuration is not supported", MsgBoxStyle.Critical)
        End If




        'clear form
        Me.CbxOS.Text = ""
        Me.CbxOffice.Text = ""
        Me.CbxInstall.Text = ""
        Me.TxtVersion.Text = ""
        Me.TxtAdminUser.Text = ""
        Me.TxtIsaSub.Text = ""
        Me.TxtContact.Text = ""
        Me.TxtPhone.Text = ""
        Me.TxtRemarks.Text = ""




    End Sub

    Private Sub CmdClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdClose.Click
        Me.Close()
    End Sub
 
Laatst bewerkt:
Je kunt in principe regel voor regel afgaan om te controleren of het klantnummer bestaat.

Voorbeeldje om je een idee te geven:
[cpp]Dim reader As New IO.StreamReader("...")
Do While reader.Peek() >= 0
If reader.ReadLine() = "klantnummer" Then ...
Loop
reader.Close()[/cpp]

Je kunt echter het beste met databases en SQL gaan werken.
 
JoZ1,

kan ik deze zoekopdracht ook uitvoeren als de waarde van de textbox TxtAdminUser.Text is ingevuld?

van zodra de waarde in TxtAdminUser ingevuld is dat de zoekopdracht start in mijn text bestand.

Aangaande je opmerking over een database ben ik het met je eens maar zoals gezegd werk ik nog maar 2 dagen met visual studio en wil eerst weten of ik op dit moment met dit text bestand gedaan krijg wat ik wil.

alvast bedankt voor je hulp
 
Ja, dat kan.

[cpp]If reader.Readline() = TxtAdminUser.Text Then ...[/cpp]

Hoewel dat natuurlijk helemaal afhankelijk is van hoe je die informatie in je bestand opslaat.
Kun je een voorbeeld geven van zo'n bestand?
 
Joz,
de gegevens in het text bestand zijn allemaal ; gescheiden
het ziet er zo uit
Code:
zaterdag 2 maart 2013;Vista;32;2007;32;Network;6.1.15.1;5107557788001;testuser;027382000;5107557788001;none;
zaterdag 2 maart 2013;Windows 7;32;2007;32;Network;6.1.15.1;50555888600124;test;027380000000;50555888600124;;
zaterdag 2 maart 2013;Vista;32;2007;32;Network;6.1.15.1;5107558886;test;0273820000;5107558886;none;
zaterdag 2 maart 2013;Vista;32;2010;32;Network;6.1.15.1;5478945566;027390000;027390000;5478945566;;
zaterdag 2 maart 2013;Vista;32;2007;32;Network;6.1.15.1;50555888600124;paul;0273820000;50555888600124;;
de waarde van txtAdminUser.text is "5107557788001"

ik ben ondertussen ook aan het kijken hoe ik dit met een db kan doen, heb een db kunnen aanmaken en zou graag weten hoe ik mijn data hierin weggeschreven krijg
nogmaals bedankt voor je hulp

mvg Paul
 
Hoi,

Je kan de string ook nog splitten op de ";", bv:
[CPP]If reader.Readline().split(";")(7) = TxtAdminUser.Text Then[/CPP]

Voor het wegschrijven naar databases zijn veel tutorials online. Daartussen kan je kijken of je een goede vindt. Ook hangt het er een beetje vanaf welke soort database je wilt gaan gebruiken (MySQL, Access, etc).


Voor iemand met 2 dagen ervaring ben je al aardig op weg, ga zo door! :thumb:

MartinJM
 
Martin bedankt voor je reactie

ik zit toch met het probleem dat ik de waarde niet uit het bestand kan halen

[CPP]
Dim reader As New StreamReader("D:\my documents\vbtest\textdata.txt")
Do While reader.Peek() >= 0
If reader.ReadLine() = TxtAdminUser.Text Then
MsgBox("found")

End If
Loop
reader.Close()

[/CPP]

met bovenstaande krijg ik geen messagebox en als ik
in mijn Immediate window kijk heb ik de volgend opmerkingen
A first chance exception of type 'System.IO.DirectoryNotFoundException' occurred in mscorlib.dll
A first chance exception of type 'System.IO.IOException' occurred in mscorlib.dll
A first chance exception of type 'System.InvalidCastException' occurred in Microsoft.VisualBasic.dll

als ik dit gebruik zonder de quotes wel te verstaan heb ik ook de bovenvermelde opmerkingen in mijn immediate window maar ik krijg wel een messagebox voor elke regel die in dit bestand terug te vinden is
[CPP]
'Dim sBuffer As String
'Using oReader As StreamReader = File.OpenText("D:\my documents\vbtest\textdata.txt")

' While Not (oReader.EndOfStream)
' sBuffer = oReader.ReadLine

' MsgBox(sBuffer)

' End While

'End Using
[/CPP]

dus ik zit een beetje vast :(

kan jij aanwijzen waar ik mijn code moet aanpassen zodat de waarde die in txtAdminUser wordt ingevuld opgezocht wordt in de textfile en middels een popup wordt weergegeven voor de gebruiker?

Kan je me misschien ook een site aanbevelen met goede tutorials voor het wegschrijven van gegevens in een database liefst in het nl maar engels is ook goed

alvast bedankt

Paul
 
Hoi,

Zelf zou ik het zo doen:
[CPP] Dim Stream As New FileStream("D:\my documents\vbtest\textdata.txt", FileMode.Open)
Dim Reader As New StreamReader(Stream)
Dim Inhoud As String = Reader.ReadToEnd
Reader.Close()
Stream.Close()

Dim Lines() As String = Inhoud.Split(New Char() {vbNewLine, Chr(13)})
For i As Integer = 0 To Lines.Count - 1 Step 1
If Lines(i).Split(";")(7) = TxtAdminUser.Text Then
MsgBox("Found!")
End If
Next[/CPP]
aangezien je het bestand zelf dan maar zo kort mogelijk open hebt.

De andere manieren zou ik zo doen (ik heb niet gechecked of ze dan wel werken):
[CPP] Dim Stream As New FileStream("D:\my documents\vbtest\textdata.txt", FileMode.Open)
Dim reader As New StreamReader(Stream)
Do While reader.Peek() >= 0
If reader.ReadLine().Split(";")(7) = TxtAdminUser.Text Then
MsgBox("found")
End If
Loop
reader.Close()
Stream.Close()[/CPP]
[CPP] Dim sBuffer As String
Using oReader As StreamReader = File.OpenText("D:\my documents\vbtest\textdata.txt")
While Not (oReader.EndOfStream)
sBuffer = oReader.ReadLine

If sBuffer.Split(";")(7) = TxtAdminUser.Text Then
MsgBox("found")
End If

End While
End Using[/CPP]

Maar ik zou, als ik jou was, altijd eerst checken of het bestand (en de map) wel echt bestaan:
[CPP] If Not Directory.Exists("D:\my documents\vbtest\ ") Then
MsgBox("Map bestaat niet!")
Exit Sub
End If
If Not File.Exists("D:\my documents\vbtest\textdata.txt") Then
MsgBox("Bestand bestaat niet!")
Exit Sub
End If[/CPP]


Ik denk dat het het makkelijkst is om de tutorials via google te vinden omdat die niet maar beperkt is met 1 site... Maar ik denk dat bijvoorbeeld dit wel een goed begin is: http://www.dreamincode.net/forums/topic/74114-a-really-simple-database/. Ik weet het niet, omdat ik zelf bijna nooit databases gebruik, en als ik ze gebruik, heb ik hier thuis een boek waar het in staat :confused:

MartinJM
 
Martin Bedankt voor je hulp,

ik krijg bij jou eerste voorbeeld effectief dat ie gevonden word dus dat is al positief echter krijg ik de volgende exception
System.IndexOutOfRangeException was unhandled
Message=Index was outside the bounds of the array.
Source=Telelink6
StackTrace:
at WindowsApplication1.frmTelelink.CmdAdd_Click(Object sender, EventArgs e) in D:\my documents\Visual Studio 2010\Projects\Telelink6\Telelink6\frmTelelink.vb:line 76
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ButtonBase.WndProc(Message& m)
at System.Windows.Forms.Button.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
at WindowsApplication1.My.MyApplication.Main(String[] Args) in 17d14f5c-a337-4978-8281-53493378c1071.vb:line 81
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException:

naar me toegesmeten ? weet jij hier raad mee?
en hoe krijg ik nu voordat ik op submit druk deze regel in een popup?

Paul
 
Staat er nog een lege regel boven of onderaan het bestand?

Het beste is trouwens sowieso om alle mogelijke fouten af te vangen en weer te geven. Dat kan met een try-catch blok: http://msdn.microsoft.com/en-us/library/fk6t46tz(v=vs.71).aspx.

Dan krijg je (bijvoorbeeld) zoiets:
[CPP] Dim FilePath As String = "C:\Users\Martin"
Dim FullFilePath As String = Path.Combine(FilePath, "test.txt")

If Not Directory.Exists(FilePath) Then
MsgBox("Map bestaat niet!")
Exit Sub
End If
If Not File.Exists(FullFilePath) Then
MsgBox("Bestand bestaat niet!")
Exit Sub
End If

Dim Inhoud As String = Nothing
Try
Dim Stream As New FileStream(FullFilePath, FileMode.Open)
Dim Reader As New StreamReader(Stream)
Inhoud = Reader.ReadToEnd
Reader.Close()
Stream.Close()
Catch ex As Exception
MsgBox("File read error:" & vbNewLine & ex.Message)
Exit Sub ''// zorgt ervoor dat de rest van de code niet nog doorgaat...
End Try

Try
Dim Lines() As String = Inhoud.Split(New Char() {vbNewLine, Chr(13)})
For i As Integer = 0 To Lines.Count - 1 Step 1
If Lines(i).Split(";")(7) = TxtAdminUser.Text Then
MsgBox("Found!")
End If
Next
Catch ex As IndexOutOfRangeException
MsgBox("IndexOutOfRangeException:" & vbNewLine & ex.Message)
Catch ex As Exception
MsgBox("Unknown exception:" & vbNewLine & ex.Message)
End Try[/CPP]

Sommige mensen zeggen dat het niet slim is om alle fouten af te vangen en met eenzelfde message te laten weten omdat het dan moeilijk is erachter te komen waar de fout precies zit. Bij het debuggen kan het dan ook handig zijn om de try-catch blokken er (tijdelijk) uit te commenten.

Bovenaan de code kan je zien dat ik nog een kleine verandering heb gemaakt. Op die manier hoef je het path en de filename maar 1 keer in te voeren.

Dan nog 1 opmerking:
Op computers van andere mensen (ik weet niet of je het programma openbaar wil maken of niet), is de kans groot dat het bestand op een andere plaats staat/de map niet bestaat/de hele driveletter niet bezet is. Daar moet je dus wel rekening mee houden als je het programma openbaar wil maken.

MartinJM
 
Martin, Bedankt voor je uitleg en code, echter ik krijg nu steeds de melding dat het bestand niet bestaat ik dacht dat het misschien aan het plaats van het bestand kon liggen dus heb ik de map vbtest verplaatst naar de c:\vbtest\testdata.txt echter blijf ik de melding krijgen dat het bestand niet bestaat bestand not found.jpg
heb je een idee hoe ik dit kan oplossen?
 
Probeer hem misschien eens in je user map te zetten. Ik denk dat je dan niet genoeg rechten hebt om het bestand daar te openen...

[edit]
Je kan ook dit als path gebruiken:
[/edit]
[CPP]Dim FilePath As String = Path.Combine(My.Computer.FileSystem.SpecialDirectories.CurrentUserApplicationData, Application.ProductName)[/CPP]
 
Laatst bewerkt:
zelfs als ik het bestand rechtstreeks op de C:\ zet krijg ik dezelfde popup bestand bestaat niet
 
Geen spelfouten? :confused: Ik kan niet echt iets meer bedenken....

Probeer eens de check op het bestand eruit te commenten en dan het programma te runnen. Misschien werkt het dan wel...
 
Laatst bewerkt:
blijft aangeven dat het bestand niet bestaat nu bij fileread error echter geeft hij het volledige bestand wel correct aan ??
geen spelfouten ik kopieer de filelocation direct uit de windows explorer

dit is de desbetreffende regel
Code:
'check if path and file excists 
        Dim FilePath As String = "C:\vbtest\"
        Dim FullFilePath As String = Path.Combine(FilePath, "testdata.txt")

en de popup is popup.JPG
 
Laatst bewerkt door een moderator:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan