P.S. If you always navigate the *data*, the datagrid
will take care of itself. That is, rather than worry
about things from the UI perspective (e.g.
CurrentCellChanged, etc.), focus on where you're at in
the data source.
Use the binding context (or better yet, a currency
manager) on the dataset/datatable that's bound to the
grid. When you move through the data in your code (e.g.
you've got a "go next" button that sets
CurrencyManager.Position += 1), the datagrid will keep up
by itself. Likewise, when the user moves around in the
datagrid on his own by changing cells, the currency
manager keeps up, so you can always display "Row
<CurrencyManager.Position> of CurrencyManager.Count>.
As an aside, best book I've seen (intermediate level) on
just such stuff is Murach's VB.NET Database Programming
with ADO.NET.
HTH