telefoonboek

Status
Niet open voor verdere reacties.
Hoi,

Ik dacht dat het probleem opgelost was.. Maar is helaas niet zo.

Ik heb het hele programma opnieuw opgebouwd, er draait nu een ms access database achter. Alles werkt (add contact, edit contact, delete contact) behalve de search contact box. (textbox + Button).

Mijn tabel heet als volgt: Customers
De volgende ''lijsten/items'' staan erin

TextBox1 = Naam
TextBox2 = Nummer
TextBox3 = Woonplaats
TextBox4 = Leeftijd
TextBox5 = Werkervaring
TextBox6 = Beroep
TextBox7 = Loon
TextBox8 = Email
TextBox9 = Beschikbaar
TextBox10 = Laatste werkgever
Textbox16 = Huidige werkgever
TextBox11 = Gereedschap
TextBox12 = Werkkleding
TextBox13 = Diploma
TextBox14 = Provincie
TextBox15 = Extra info

Textbox 16 is later toegevoegd.

Als het kan wil ik zoeken op een aantal items (als kan alles).
wanneer bijvoorbeeld de eerste reeks dit is: Jantje - 0612345678 - Rotterdam - 25 - geen - vuilnisman

Dat wanneer je op Jantje zoekt, dat ook daadwerkelijk de gehele rij blijft staan en dat dat dan ook de enigste (mits dubbele naam) is die nog zichtbaar is in de listview (LvList) Maar ook wanneer je bijvoorbeeld op beroep zoekt.

Ik hoop dat het lukt!

Groetjes
Maarten

PS: Vragen? stel ze gerust
 
Hoe heb je de "EDIT" geimplementeerd? Als je namelijk een bestaand profiel kunt terugvinden in de database heb je in principe alle kennis om ook de zoekopdracht te volbrengen.

Je kunt een SQL query naar je database sturen:

Code:
Select * from Customers where

Achter de where moet je de gewenste kolomnaam en de opdracht zetten. Ik neem aan dat je kolom met de namen "naam" heet. zoeken op Jantje wordt dan:

Code:
Select * from Customers where naam = 'Jantje'

Zolang je dus de kolomnaam hebt en de zoekopdracht kun je de query die je naar de database wilt sturen dus eenvoudig zelf opbouwen
 
Dit is de code van de dubbelklik (edit mode)

Code:
Private Sub lvList_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles lvList.DoubleClick
        Dim Naam As String

        For Each sItem As ListViewItem In lvList.SelectedItems
            Naam = sItem.Text
        Next

        With frmCustomers
            .State = gModule.FormState.adStateEditMode
            .Naam = Naam

            .ShowDialog()

            Call FillList()
        End With

        frmCustomers = Nothing
    End Sub

Dit is de FormState code

Code:
Public Enum FormState
        adStateAddMode = 0
        adStateEditMode = 1
    End Enum


Waar maak je die Query aan?
Mijn kolommen heten overigens precies hetzelfde als het lijstje, Het lijstje wat ik opgegeven had, dat zijn alle kolommen.

Alvast bedankt!
 
ok hoe wordt lvlist gevuld dan? Ergens moet je toch connectie maken met access en de data in je programma brengen? Overigens kun je een massa data vinden via google over dit onderwerp, maar ik probeer eerst uit te vinden waar je nu bent :)
 
Ik heb de database aller eerst gemaakt, vervolgens heb ik bij data source de database toegevoegd (daarna kan je een query aanmaken)

Mijn applicatie maakt verbinding met de database op de volgende manier:
Code:
Public Const cnString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=..\Data\sample.mdb"

Wanneer die verbinding heeft laad die direct de volgende gegevens uit de database.
Code:
Private Sub frmCustomersList_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        sSql = "SELECT Naam, Nummer, Woonplaats, Leeftijd, Werkervaring, Beroep, Loon, Email, Beschikbaar, LaatsteWerkgever, HuidigeWerkgever, Gereedschap, Werkkleding, Diploma, Provincie, ExtraInfo FROM Customers ORDER BY Naam ASC"

        Call FillList()
End Sub

Vervolgens plaatst die ze in de LvList:
Code:
Private Sub FillList()
        With lvList
            .Clear()

            .View = View.Details
            .FullRowSelect = True
            .GridLines = True
            .Columns.Add("Naam", 100)
            .Columns.Add("Nummer", 100)
            .Columns.Add("Woonplaats", 100)
            .Columns.Add("Leeftijd", 100)
            .Columns.Add("Werkervaring", 100)
            .Columns.Add("Beroep", 100)
            .Columns.Add("Loon", 100)
            .Columns.Add("Email", 100)
            .Columns.Add("Beschikbaar", 100)
            .Columns.Add("LaatsteWerkgever", 100)
            .Columns.Add("HuidigeWerkgever", 100)
            .Columns.Add("Gereedschap", 100)
            .Columns.Add("Werkkleding", 100)
            .Columns.Add("Diploma", 100)
            .Columns.Add("Provincie", 100)
            .Columns.Add("ExtraInfo", 100)

            FillListView(lvList, GetData(sSql))
        End With
    End Sub

Code:
Public Function GetData(ByVal sSQL As String)
        Dim cnCustomers As OleDbConnection
        Dim sqlCmd As OleDbCommand = New OleDbCommand(sSQL)
        Dim myData As OleDbDataReader

        cnCustomers = New OleDbConnection(cnString)

        Try
            cnCustomers.Open()

            sqlCmd.Connection = cnCustomers

            myData = sqlCmd.ExecuteReader

            Return myData
        Catch ex As Exception
            Return ex
        End Try
    End Function

Code:
Public Sub FillListView(ByRef lvList As ListView, ByRef myData As OleDbDataReader)
        Dim itmListItem As ListViewItem

        Dim strValue As String

        Do While myData.Read
            itmListItem = New ListViewItem()
            strValue = IIf(myData.IsDBNull(0), "", myData.GetValue(0))
            itmListItem.Text = strValue

            For shtCntr = 1 To myData.FieldCount() - 1
                If myData.IsDBNull(shtCntr) Then
                    itmListItem.SubItems.Add("")
                Else
                    itmListItem.SubItems.Add(myData.GetString(shtCntr))
                End If
            Next shtCntr

            lvList.Items.Add(itmListItem)
        Loop
    End Sub

denk dat dit wel voldoende code is om te weten hoe die verbinding maakt met de database en de gegevens importeert.
 
Wat je indedaard in deze code doet is een select:

Code:
in je listview code:

FillListView(lvList, GetData(sSql)

///sSql = nu dit: 
sSql = "SELECT Naam, Nummer, Woonplaats, Leeftijd, Werkervaring, Beroep, Loon, Email, Beschikbaar, LaatsteWerkgever, HuidigeWerkgever, Gereedschap, Werkkleding, Diploma, Provincie, ExtraInfo FROM Customers ORDER BY Naam ASC"

///als je sSQL aanpast naar:

sSQL = "Select * from Customers where naam = Jantje"

zou het moeten werken. je kunt natuurlijk ook direct de string meegeven in de filllistview procedure.

EDIT: het '*' in de select betekend alle kolommen in de standaard volgorde. select * is dus hetzelfde als "SELECT Naam, Nummer, Woonplaats, Leeftijd, Werkervaring, Beroep, Loon, Email, Beschikbaar, LaatsteWerkgever, HuidigeWerkgever, Gereedschap, Werkkleding, Diploma, Provincie, ExtraInfo" zolang je de volgorde van de kolommen niet wil aanpassen
 
Laatst bewerkt:
aller eerst bedankt voor de hulp! het werkt deels. Hij zoekt idd! Heb het iets aangepast:

Code:
Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
        FillListView(lvList, GetData(sSql))
        sSql = "Select * from Customers where naam = Textbox1.Text"
    End Sub

vervolgens debug ik hem, en typ de eerste letter in van de naam. Jaja dan komt het, alle records in de database worden dan verdubbelt, dus jantje staat er dan 2x ipv 1x. (dat is dus fout1)
2nlfwn8.jpg


vervolgens wanneer ik de 2de letter intyp, dus de letter a. Dan krijg ik een foutmelding en sluit de debugger deels af. (dit gebeurd ook wanneer ik de eerste letter weghaal met backspace)
1zlqcy1.jpg


Dit zal niet de bedoeling zijn neem ik aan.


EDIT: Van dat '*' daar was ik al achter, Door die query aan te maken kwam ik daar achter. daar kon je ook kiezen tussen die kolommen. Maar in elk geval nog bedankt om het uitgebreid uit te lechen! ;)

EDIT2: Even de foto aangepast.
 
Laatst bewerkt:
1) Op het plaatje heb je twee keer "select".
2) Ook verander je sSQl NA de aanroep, ipv ervoor.
3) om sSQL te bouwen moet je:

Code:
sSQL = "Select * from Customers where naam = " & Textbox1.Text

gebruiken.
 
werkt niet bij mij, heb al van alles geprobeerd. Heb de 2de select weggehaald (was ongezien foutje van mij) verandert niets. Heb sSqL ook in sSQL veranderd, maar hij veranderd hem automatisch weer terug naar sSqL, omdat dit een string is.

Heb al van alles geprobeerd met die Select * from Customers where naam = " & Textbox1.Text. Heb dat sterretje ook alweer terug verandert in naam, nummer etc etc. Werkt allemaal niet. Heb die zelfs 2 keer geplaatst. Bij frmCustomerlist_load en ook nog bij die textbox. Als je zou willen zou je jou email adres anders even kunnen geven? dan zou ik jou de gehele file door kunnen sturen. wil hem liever niet als bijlage hebben. (kan volgens mij ook niet) dan zou je er zelf even naar kunnen kijken.

of als je wilt dan kan je gewoon een mail sturen naar mij
 
Laatst bewerkt:
Staat genoteerd ;) ik ben deze week erg druk, maar ik zal proberen tegen morgenavond even even mailtje te sturen. Ik zit momenteel nog via mijn werk en daar is alle externe mail geblocked dus kan ik niets uitsturen, ook niet via webmail
 
bedankt man! (Y) Misschien een oplossing van je antwoord :P kan je geen proxy server gebruiken? Via firefox en andere browsers is een proxy gemakkelijk in te vullen.
 
Ok, de aanpassing was niet zo moeilijk. Moeilijker was het project compilen en de database werkend krijgen en tijd vinden :)

Ik heb fillList zo aangepast:

Code:
Private Sub FillList(Optional ByVal altcall As String = "")
        With lvList
            .Clear()

            .View = View.Details
            .FullRowSelect = True
            .GridLines = True
            .Columns.Add("Naam", 100)
            .Columns.Add("Nummer", 100)
            .Columns.Add("Woonplaats", 100)
            .Columns.Add("Leeftijd", 100)
            .Columns.Add("Werkervaring", 100)
            .Columns.Add("Beroep", 100)
            .Columns.Add("Loon", 100)
            .Columns.Add("Email", 100)
            .Columns.Add("Beschikbaar", 100)
            .Columns.Add("LaatsteWerkgever", 100)
            .Columns.Add("HuidigeWerkgever", 100)
            .Columns.Add("Gereedschap", 100)
            .Columns.Add("Werkkleding", 100)
            .Columns.Add("Diploma", 100)
            .Columns.Add("Provincie", 100)
            .Columns.Add("ExtraInfo", 100)

            If altcall = "" Then
                FillListView(lvList, GetData(sSql))
            Else
                FillListView(lvList, GetData(altcall))
            End If
        End With
    End Sub

vervolgens heb ik dit in textbox changed:

Code:
Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
        Dim querystring As String
        querystring = "select * from customers where naam LIKE '" & TextBox1.Text & "%' or beroep LIKE '" & TextBox1.Text & "%' or woonplaats LIKE '" & TextBox1.Text & "%'"
        FillList(querystring)
    End Sub

de box zoekt nu alleen op naam, beroep en woonplaats. Anders wordt het snel een zooitje :P . als dit nog niet geheel voldoet hoeft alleen de string nog aangepast te worden.
 
Hartstikke bedankt! zal het direct even aanpassen!!!! en zien of die werkt :D mocht ik toch nog problemen tegen komen, dan meld ik het direct!
 
Het werkt perfect! Echt hartstikke bedankt! De vraag is opgelost nu en het programmaatje is klaar voor gebruik.
 
Een probleem waar ik tegen aan liep is dus dat je database connector niet 64-bit compatible is (ja ja echt bij de tijd microsoft). Het kan dus zijn dat bij mensen met 64-bit systemen je database weigert te laden. Om dat te voorkomen moet je je programma "releasen" met forced 32-bit compatibility. Of ODBC gebruiken, maar ik neem aan dat je liever niet teveel meer aan je programma wil prutsen :P
 
ik vind het goed zo om eerlijk te zijn XD Elke computer hier heeft win xp 32 bits erop staan. dus het werkt prima hier. het programma is enkel voor hier eigenlijk. het werkt goed dusja :)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan