Here's a minimal bit of code to demo how to do it. In this case I'm assuming only 2 columns in your table. I'm assuming you are clicking a button outside the grid to save the changes so you are forcing the DGV to finish edit. I have broke the loading/saving of the data into separate functions so you can more easily drop them where you need them to go rather than mixing concerns.
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim ds = LoadData()
BS_Projects.DataSource = ds
BS_Projects.DataMember = "Projects"
DGV_Projects.DataSource = BS_Projects
End Sub
Private Sub btn_saveProj_Click(sender As Object, e As EventArgs) Handles btn_saveProj.Click
BS_Projects.EndEdit()
SaveData(BS_Projects.DataSource)
DGV_Projects.Refresh()
End Sub
Private Function LoadData() As DataSet
Using conn As New OleDbConnection(connString)
Dim selectCommand As New OleDbCommand("SELECT ID, Title FROM ProjectsDB", conn)
Dim ds As New DataSet
' Load data
Dim da As New OleDbDataAdapter(selectCommand)
conn.Open()
da.Fill(ds, "Projects")
Return ds
End Using
End Function
Private Sub SaveData(ds As DataSet)
Using conn As New OleDbConnection(connString)
Dim selectCommand As New OleDbCommand("SELECT ID, Title FROM ProjectsDB", conn)
Dim da As New OleDbDataAdapter(selectCommand)
' For simple tables you can get the commands auto-generated, otherwise create the commands manually
' and set the appropriate properties on the da
Dim builder As New OleDbCommandBuilder(da)
da.InsertCommand = builder.GetInsertCommand()
da.UpdateCommand = builder.GetUpdateCommand()
da.DeleteCommand = builder.GetDeleteCommand()
Dim changes = ds.GetChanges()
' Save data
conn.Open()
da.Update(ds, "Projects")
End Using
End Sub
Private Const connString = "..."
End Class
Note that if you're using Access and you are putting the DB into the output directory of the project then ensure that each time you run the debugger you haven't configured it to overwrite the modified DB otherwise you will never see your changes.