Working with Data Grids

I am having a little trouble working with Data grids.  I have the code to pull data from a DB using select statements and I put this data into a data table.

hen I set the DataGrid.datasource = to the data table.  It works fine.  My problem comes in when I try to edit the data.  I need help working with the data grid.  I want the user to double click the grid and have the row they double clicked appear in a new form for editing.  SO I take the value for each column in the ROW selected and place them in Text boxes/combo boxes and allow the user to edit.  Then when they save I want the updated data returned to the grid.  I have it all almost working now.  I know there is a better way but  Here is how I do it,

 When the user double clicks the grid I define a temp data table = DataGrid.datasource and set the current row of the temp table  = to DataGrid.currentRowIndex.  Then I pull the data from the Temp Table and populate the form.  When the data is saved I just update the temp table and set the DataGrid.datasource = to the temp table.  This is very sloppy I think.  But here is the real problem.  When the datagrid gets sorted by the user in some manor and I set the temp table = to the datagrid.datasource they are no longer sorted the same.  The temp table gets the original sort order and the currentRowIndex on the Grid no longer points to the correct row in my table.  I understand this problems comes from my poor method of handling the data grid and I would like a better solution and not a fix for my current method.  Thanks for any help.

Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

ok your method looks ok except i would not use the temp table. so here is some pseudo code of how i would do it

'pull back from DB your data

'bind the table to the grid
YourDataGrid.Datasource = yourDataTable

'use binding manager base to preserve currentRowIndex when sorted
Dim bm As BindingManagerBase = YourDataGrid.BindingContext(YourDataGrid.DataSource, YourDataGrid.DataMember)

'when someone double clicks a row get the selected row and pass that to your editting form
Dim dr As DataRow
dr = CType(bm.current, DataRowView).Row

'this will pass the row object from your original datatable to the form
Dim YourEditForm As New YourEditForm(dr)

'make sure you add this to the new constructor in YourEditForm:
Public Sub New(dr as Datarow)
    localDataRow = dr
End Sub

'bind the datarow to your textboxes, and other editting controls, so when the values are changed in the text boxes the data table is updated automatically.
textbox1.DataBindings.Add("Text", dr.Table, "YourColumnName1")
textbox2.DataBindings.Add("Text", dr.Table, "YourColumnName2")

'save button on YourEditForm, this will save back to the database your changes, when you close the form the grid should reflect the changes

'as a side note you can also roll back changes not committed to the database by
'YourDataGrid will always be bound to YourDataTable so whatever changes occur in that will stay consistent

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
jtwestmoAuthor Commented:
A Couple of question for you

1.  I don't know much about the binding manager so the line
Dim bm As BindingManagerBase = YourDataGrid.BindingContext(YourDataGrid.DataSource, YourDataGrid.DataMember)
Am I just creating a binding object that links the grid datasource to ???.datamember?

2.  Question about scope.  Is the Dim bm As BindingManagerBase global to the entire form and is alive until the form goes away?   The same question about dr on the edit form.

Does dr have a link to the original grid becaseu we passed dr to the form byreference?

Your solution seems correct I just want to make sure I fully understand it.

the binding manager is an object that helps maintain the index when a datatable is bound to a datagrid. then you instantiate the bindingcontext for the datagrid you are pointing to what datasource and datamember the grid is bound to. this way the bindingmanager will be able to keep its index as different rows are selected.

as for the scope of the bindingmanager it depends on where throughout the form you need it. if you just need it in the double click even you can instantiate it just there it does not need to be global to the form. i usually keep everything as local as possble before increasing the scope.

the dr in the Edit Form should be global to the Edit form because it has to be passed by reference in the constructor. the dr is a pointer to a row in the datatable so changing its value will directly effect the datatable.
Cloud Class® Course: CompTIA Cloud+

The CompTIA Cloud+ Basic training course will teach you about cloud concepts and models, data storage, networking, and network infrastructure.

jtwestmoAuthor Commented:
Just one more question though how do you go about adding a new data row.  Instead of editing exsiting data I want to add a new row.  DO you use bm.addnew  but then how to you specify for it to add the data row as the new odject?
no the bm is not used to add a new row. if you have allow edit enabled the datagrid will handle the addition of the a new row. the bm again will just point to that row the same way it does for existing rows. if you want to programmatically add a new row say using a button and then popping up a the EditForm you can do this:

Dim dr as DataRow

dr = YourDataTable.NewRow

'pass the new row to the Edit Form, and then bind the dr to the textboxes like i stated above
Dim YourEditForm as New YourEditForm(dr)

'when the ok or save button is clicked on the edit form you can then add the row to the datatable(you can also save to the database if you want at this point). but now the grid should have the new entry listed.
just so i don't confuse you, since dr is a reference to a row from YourDataTable, dr.Table is referencing YourDataTable
jtwestmoAuthor Commented:
You're exactly right, I don't know why I didn't see that.  That's so much for the help.
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Visual Basic.NET

From novice to tech pro — start learning today.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.