if you are using buttons to move first, next, or previous then on the click event of the button check the rowstate of the current row ; newly added row will have a rowstate of Detached, if you call the endEdit method of your binding source then the rowstate will be Added
if you modify the record by changing the value in a data-bound text box then the rowState will be Modified
so in the click event of your button:
if((DataRowView)this.Bs.Current).Row.RowState == DataRowState.Added ||
(DataRowView)this.Bs.Current).Row.RowState == DataRowState.Detached ||
(DataRowView)this.Bs.Current).Row.RowState == DataRowState.Modified)
{
//prompt the user to save or cancel the changes made
//if canceled then bs.MoveNext
}
//note Bs is your binding source