Problem with datagridview

M

Martin

Hi all,

This is the situation...

DatagridView Control with datasource set to datatable.

I want the user to be able to delete x number of rows by selecting a row
with mouse then clicking a 'delete' button.

Then user clicks a 'Commit' button to update the database.

This is my delete row code:

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button3.Click
If Me.DataGridView1.SelectedRows.Count = 0 Then Exit Sub
Dim x As Integer = bs.Position
udt.Item(x).Delete()
End Sub

This is my commit changes code:

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button2.Click
uta.Update(udt)
End Sub

The problem is that once I have deleted a row, the datatable and
datagridview become unsynchronized and the selected row in the datagrid
isn't the one that will be deleted from the dataset. (I hope that makes
sense)

I can keep things in sync by calling datatable.acceptchanges() after the row
deletion, but then the tableadapter.update() command doesn't write the
changes to the database.

Any helpful suggestions will be greatly appreciated. I can post the complete
(simplified) example if it will help.

Kind regards,

Martin.
 
C

Cor Ligthert [MVP]

Martin,

Just something how a datatable is working, I think that you than will easily
handle your problem.

A datatable hold rows. All the rows have rowstatuses which have statuses.
This can be deleted, changed new, unchanged (and one other one but for this
not important).

If you do an update all rows with a status deleted, changed and new are
handled, they use than the SQL commands, Delete, Update and Insert. The
nonchanged rows are not handled. The state of the row when it was retrieved
using the select is hold as well in the datarow. This is checked to the
currentstate of the datatabase. If there is a difference between those,
there is a currencyerror.

If the rows are handled correct than the dataadapter.update command has an
inbuild AcceptChanges command. What AcceptChanges does is setting all rows
to unchanged and removes the change information. By that it becomes again
equal to the current state of the database.

Be aware that this is very confusing in your code, if this is true I would
change it as quick as possible.

udt.Item(x).Delete(). I can not find what this means.Be also aware that you
should do deletes in a collection always bottom up, you will become sure in
problem if you don't doe that, because otherwise the position is changing.

I hope that this gives you the information to handle your problem.

Cor
 
M

Martin

Hi Cor,

Thanks for the response, I agree, my example wasn't very clear, sorry about
that.

I have, however been tinkering since my first post and have come up with a
resonable solution; To the grid I add a non-databound extra column and once
the grid is populated I fill each cell in this column with the index of the
containing row. I then use this value to calculate which row to delete when
I select a row.

This approach enables me to delete rows in an arbitrary order and then
either commit or reject the changes as I wish.

I'm sure it's a design issue that has led to this problem in the first
place, but as a relative beginner to vb2005 and database programming in
general I'm still very much on a learning curve.

Once again, thanks,

Martin.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top