Database met 1 form en 1 datagridview

Status
Niet open voor verdere reacties.

Schipperjte

Gebruiker
Lid geworden
24 jan 2006
Berichten
212
Ik wil graag een database maken met een access bestand.

In dit bestand staan
week1 :Tabel
week2 :Tabel
week3 :Tabel
Enz

Hoe kan ik zonder de wizard 1 van deze Tabel's in een datagridview krijgen, wil dit via een button doen.
Button 1 is week 1 enz

En dit zou dan in 1 form moeten , anders heb ik dadelijk 52 forms en dat is niet de bedoeling.

Dus bedoeling is :
1 form met datagridview
3 button's ( worden er 52)
Button 1 dan zou week1:Tabel moeten worden ingevoerd in de datagridview, en dan edit ,save enz.

Is dit mogelijk ?
 
Ja, dit is mogelijk.

Als je weet hoe je een database kan connecten, dan hoef je alleen nog even naar de SQL te kijken:

SQL syntax:
Code:
SELECT * FROM  ^^TABELNAAM^^


Wat ik dan zou doen is een sub aanmaken met byval tabelnaam, dan daarin connecten met de database en dan als SQL statement:
Code:
"SELECT * FROM " & tabelnaam

Dan daarna bij iedere button de naam van de sub met daarachter (tussen haakjes) de tabelnaam die erbij hoort.

Succes!



PS: Ik heb hier een boek wat ik altijd gebruik, en daarin staat een voorbeeld van hoe je een database vanuit je code kan 'connecten'. Dit is dat voorbeeld:
Code:
Imports System.Data.SqlClient

Dim strSql As String = ""
Dim strConnectionString As String = ""

strSql = "SELECT * FROM KlantenDataTable"
strConnectionString = "data source=mijncomputernaam;initial catalog=KlantenBeheer;Integrated Security=SSPI;"

Dim objConnection As new sqlconnection(strConnectionstring)
dim objdataadapter as sqldataadapter
objdataadapter = new sqldataadapter(strsql, objconnection)
dim objcommandbuilder as sqlcommandbuilder
objcommandbuilder = new sqlcommandbuilder(objdataadapter)

dim objdataset as new dataset
objdataadapter.fill(objdataset, "KlantenDataTable")

dim objbindingsource as new bindingsource
objbindingsource.datasource = objdataset.tables("KlantenDataTable")

Datagridview1.datasource = objbindingsource

Dit is effe snel overgetypt, dus er kunnen wat foutjes in zitten en je moet het nog (veel) aanpassen aan wat je al hebt/je database...

Voor de goede connectionstring kan je hier kijken: http://connectionstrings.com/

Dus een access database(2007): http://connectionstrings.com/access-2007
 
Ik heb wat gevonden om een datagrid te vullen.

met button 1 week 1 en button 2 week 2 .

Werkt wel , alleen kan het nog niet saven .

Maar is wat anders als jij bedoeld denk ik , kan niet via server.
Gaat op andere pc's bij andere mensen thuis .

Dit heb ik gevonden.

Code:
Imports System.Data

Imports System.Data.OleDb

Imports System.Data.Odbc

Imports System.Data.DataTable
Public Class Form1
    Dim provider As String

    Dim dataFile As String

    Dim connString As String

    Dim myConnection As OleDbConnection = New OleDbConnection

    Dim ds As DataSet = New DataSet

    Dim da As OleDbDataAdapter

    Dim tables As DataTableCollection = ds.Tables


    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        provider = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source ="

        dataFile = "C:\som\Week.mdb"

        connString = provider & dataFile

        myConnection.ConnectionString = connString

        da = New OleDbDataAdapter("Select [plaats], [soort], [gewicht] from week1", myConnection)

        da.Fill(ds, "week1")

        ' replace "items" with the name of the table

        ' replace [Item Code], [Description], [Price] with the columns headers

        Dim view1 As New DataView(tables(0))

        Dim source1 As New BindingSource()

        source1.DataSource = view1

        DataGridView1.DataSource = view1

        DataGridView1.Refresh()
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        provider = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source ="

        dataFile = "C:\som\Week.mdb"

        connString = provider & dataFile

        myConnection.ConnectionString = connString

        da = New OleDbDataAdapter("Select [plaats], [soort], [gewicht] from week2", myConnection)

        da.Fill(ds, "week2")

        ' replace "items" with the name of the table

        ' replace [Item Code], [Description], [Price] with the columns headers

        Dim view1 As New DataView(tables(0))

        Dim source1 As New BindingSource()

        source1.DataSource = view1

        DataGridView1.DataSource = view1

        DataGridView1.Refresh()
    End Sub
End Class
 
Dit werkt wel beter , als ik van week 1 naar week 2 ga en terug

Komt al in de buurt wat MartinJM bedoeld geloof ik.

Code:
Imports System.Data.OleDb
Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim connectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\som\Week.mdb;"
        Dim sql As String = "SELECT * FROM week1"
        Dim connection As New OleDbConnection(connectionString)
        Dim dataadapter As New OleDbDataAdapter(sql, connection)
        Dim ds As New DataSet()
        connection.Open()
        dataadapter.Fill(ds, "week1")
        connection.Close()
        DataGridView1.DataSource = ds
        DataGridView1.DataMember = "week1"
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim connectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\som\Week.mdb;"
        Dim sql As String = "SELECT * FROM week2"
        Dim connection As New OleDbConnection(connectionString)
        Dim dataadapter As New OleDbDataAdapter(sql, connection)
        Dim ds As New DataSet()
        connection.Open()
        dataadapter.Fill(ds, "week2")
        connection.Close()
        DataGridView1.DataSource = ds
        DataGridView1.DataMember = "week2"
    End Sub
End Class
 
*EDIT* tipje: kopiëer dit naar een nieuw vb project -> daarin heb je kleurtjes waardoor het overzichtelijker wordt....


Dit bedoelde ik inderdaad, maar dan is dit volgens mij toch makkelijker:

Code:
Imports System.Data.OleDb
Public Class Form1

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        databaseopenen("week1")
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        databaseopenen("week2")
    End Sub

    Private Sub databaseopenen(ByVal tabelnaam As String)
        Dim connectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\som\Week.mdb;"
        Dim sql As String = "SELECT * FROM " & tabelnaam
        Dim connection As New OleDbConnection(connectionString)
        Dim dataadapter As New OleDbDataAdapter(sql, connection)
        Dim ds As New DataSet()
        connection.Open()
        dataadapter.Fill(ds, tabelnaam)
        connection.Close()
        DataGridView1.DataSource = ds
        DataGridView1.DataMember = tabelnaam
    End Sub
End Class

Dit is dan vooral ook makkelijker aangezien je anders een heleboel 52x moet kopiëren, en nu hoef je maar 1 regeltje te kopiëren (en aan te passen)(het regeltje "databaseopenen(week*)")...


Wijzigen zou dan zo moeten:
Code:
    Private Sub databaseopslaan(ByVal tabelnaam As String)
        Dim strsql As String
        Dim strconnection As String
        Dim objdataset As New dataset
        Dim objdatarow As datarow

        strsql = "SELECT * FROM " & tabelnaam
        strconnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\som\Week.mdb;"

        Dim objconnection As New oledbconnection(strconnection)
        Dim objdataadapter As New oledbdataadapter(strsql, objconnection)
        Dim objcommandbuilder As New oledbcommandbuilder(objdataadapter)

        objdataadapter.fill(objdataset, tabelnaam)

        objdatarow = objdataset.tables(tabelnaam).rows.find(0) 'die 0 moet je dan aanpassen aan wat je wilt opslaan.

        objdatarow("veld dat je wilt wijzigen") = "value"

        objdataadapter.update(objdataset.tables(tabelnaam))
    End Sub

Iets toevoegen:
Code:
    Private Sub databasetoevoegen(ByVal tabelnaam As String)
        Dim strsql As String
        Dim strconnection As String
        Dim objdataset As New DataSet
        Dim objdatarow As DataRow

        strsql = "SELECT * FROM " & tabelnaam
        strconnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\som\Week.mdb;"

        Dim objconnection As New OleDbConnection(strconnection)
        Dim objdataadapter As New OleDbDataAdapter(strsql, objconnection)
        Dim objcommandbuilder As New OleDbCommandBuilder(objdataadapter)

        objdataadapter.Fill(objdataset, tabelnaam)

        objdatarow = objdataset.Tables(tabelnaam).NewRow

        objdatarow("veld1") = "value veld1"
        objdatarow("veld2") = "value veld2"
        'enz...

        objdataset.Tables(tabelnaam).Rows.Add(objdatarow)

        objdataadapter.Update(objdataset.Tables(tabelnaam))
    End Sub


Ik weet niet of dit werkt/klopt, want ik heb even geen office, dus geen access database. Verder is dit uit de losse pols geschreven, dus er kunnen ook nog wat foutjes in zitten. Maar het zou wel ongeveer zo moeten....

Let op: Je moet alles nog wel aanpassen: dit is pas het begin!

Succes!:thumb:


PS: Als je handig bent met SQL commands kan het ook zo:
Code:
    Private Sub sql(ByVal tabelnaam As String)
        Dim strsql As String = ""
        Dim strconnectionstring As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\som\Week.mdb;"

        Dim objconnection As New OleDbConnection(strconnectionstring)
        Dim objcommand As New OleDbCommand(strsql, objconnection)

        strsql = "UPDATE " & tabelnaam & " SET veldnaam = 'value' WHERE naam = naam" 'dit moet je aanpassen, dit is een voorbeeld...

        objcommand.Connection.Open()
        objcommand.CommandText = strsql
        objcommand.ExecuteNonQuery()
        objcommand.Connection.Close()
    End Sub

Met deze code kan je dan iets toevoegen en iets veranderen, je hoeft dan alleen strsql aan te passen...
 
Laatst bewerkt:
Hoi , bedankt.

Het werkt , ook het toevoegen

Alleen het opslaan ben ik nog niet helemaal uit.

heb er dit van gemaakt, zal wel iets fout doen.
Als je opslaat neemt hij alles toch mee , in plaats van 1 row ?

Code:
 Private Sub databaseopslaan(ByVal tabelnaam As String)
        Dim strsql As String
        Dim strconnection As String
        Dim objdataset As New dataset
        Dim objdatarow As datarow

        strsql = "SELECT * FROM " & tabelnaam
        strconnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\som\Week.mdb;"

        Dim objconnection As New oledbconnection(strconnection)
        Dim objdataadapter As New oledbdataadapter(strsql, objconnection)
        Dim objcommandbuilder As New oledbcommandbuilder(objdataadapter)

        objdataadapter.fill(objdataset, tabelnaam)

        objdatarow = objdataset.Tables(tabelnaam).Rows.Find(1) 'die 0 moet je dan aanpassen aan wat je wilt opslaan.

        objdatarow("week1") = "value"

        objdataadapter.update(objdataset.tables(tabelnaam))
    End Sub

    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
        databaseopslaan("week1")
    End Sub

dit geeft hij voor error
Code:
  objdatarow = objdataset.Tables(tabelnaam).Rows.Find(1) 'die 0 moet je dan aanpassen aan wat je wilt opslaan.

De tabel heeft geen primaire sleutel.

En dit zal ook wel niet goed zijn
Code:
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
        databaseopslaan("week1")
    End Sub
 
Had nog niet goed gekeken, hij slaat wel op bij Toevoegen.

Alleen ververst hij de datagridview niet.

Code:
 Private Sub databasetoevoegen(ByVal tabelnaam As String)
        Dim strsql As String
        Dim strconnection As String
        Dim objdataset As New DataSet
        Dim objdatarow As DataRow

        strsql = "SELECT * FROM " & tabelnaam
        strconnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\som\Week.mdb;"

        Dim objconnection As New OleDbConnection(strconnection)
        Dim objdataadapter As New OleDbDataAdapter(strsql, objconnection)
        Dim objcommandbuilder As New OleDbCommandBuilder(objdataadapter)

        objdataadapter.Fill(objdataset, tabelnaam)

        objdatarow = objdataset.Tables(tabelnaam).NewRow

        objdatarow("plaats") = TextBox1.Text
        objdatarow("soort") = TextBox2.Text
        'enz...

        objdataset.Tables(tabelnaam).Rows.Add(objdatarow)

        objdataadapter.Update(objdataset.Tables(tabelnaam))
    End Sub
      
    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        databasetoevoegen("week1")

    End Sub
 
Alleen ververst hij de datagridview niet.
Code:
databaseopenen(tabelnaam)

Ik kan nu geen oplossing bedenken voor het opslaan probleem, omdat ik op mijn telefoon zit...

Zodra ik weer op mijn computer online ben, zal ik nog eens kijken!

PS: wel kan ik je vertellen dat het opslaan lijkt op het toevoegen, dus hij neemt alleen de velden mee die jij erin zet. Ik zal e.v.t. nog meer uitleg geven, als ik weer op mijn computer online ben!
 
Laatst bewerkt:
Hoi,

De error die je krijgt, die klopt, omdat ik dat fout had gedaan.. Sry daarvoor..
Hoe het wel kan is zo:
Code:
objdatarow = objdataset.Tables(tabelnaam).Rows.Item(0)

Daarbij is 0 de eerste rij, 1 de tweede rij enz..


Wat ik zag, was dat je het toevoegen goed had veranderd, en wat ik in mijn vorige post ook al had gezecht: Het opslaan lijkt op het toevoegen...

Jij had als code bij het opslaan dit gemaakt:
Code:
objdatarow("week1") = "value"
Terwijl je dat bij het toevoegen zo had gedaan:
Code:
objdatarow("plaats") = TextBox1.Text
objdatarow("soort") = TextBox2.Text

Het opslaan en toevoegen werkt gewoon hetzelfde :thumb:

Verder neemt hij maar 1 row mee doordat je "objdatarow = objdataset.Tables(tabelnaam).Rows.Item(0)" gebruikt om 1 row te specificeren.

Verder is dat laatste stukje code wat je hebt gepost wel goed (voor dit stukje code).

Succes!:thumb:
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan