Using the CurrencyManager in VB.NET:

    Private WithEvents cm As CurrencyManager
    
    
    Public Sub hookDataSetToGui(ByVal dsRun As DataSet) _
     Implements IEntryScreen.dataBindToDataSet

        Dim dt As DataTable

        Try
            Me.dsTemp = dsRun

            ' we know we only want one table from the dataset for now
            dt = Me.dsTemp.Tables(0)

            ' bind to a CurrencyManager (at module scope) to control what row the user
            ' is viewing in the GUI
            Me.cm = CType(Me.BindingContext(Me.dsTemp.Tables(0)), CurrencyManager)

            ' Note that the way we're currently writing bindings assumes that...
            ' 1.) You know what the names of the DataTable's columns are when you're
    '     writing the screen code, and...
            ' 2.) Those names aren't going to change.


            '=======================================================
            ' ADD BINDINGS FROM DATASET TO GUI
            ' Generally you might want to give yourself more generic
    ' flexibility with stuff like this, but
            ' we're going to get pretty specific with the GUI anyway.
            '========================================================
            Me.txtFname1.DataBindings.Add(New Binding("Text", dt, "T_NAMEF1"))
            Me.txtLname1.DataBindings.Add(New Binding("Text", dt, "T_NAMEL1"))
            Me.txtSsn.DataBindings.Add(New Binding("Text", dt, "T_NAMESSN1"))

            ' init the label showing what row we're on (the first)
            If Not Me.dsTemp Is Nothing AndAlso Not Me.dsTemp.Tables.Count < 1 Then
                Me.lblPosition.Text = "Item 1 of " & Me.dsTemp.Tables(0).Rows.Count
            End If

        Catch ex As Exception
            mdlErr.errp("UcTaxableOwner", ex)
        End Try
    End Sub


    
    Private Sub cmdFirst_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) _
     Handles cmdFirst.Click
        
' First "Record"
        If Not (Me.cm Is Nothing) AndAlso Me.cm.Count Then Me.cm.Position = 0
    End Sub

    Private Sub cmdPrevious_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) _
        Handles cmdPrevious.Click
        
    ' Previous row
        With Me.cm
            If Not (Me.cm Is Nothing) Then
                If (.Count AndAlso .Position > 0) Then
                    .Position -= 1
                Else
                    ' TODO: Include changes to the GUI buttons 
                    ' (dis/enable as appropriate)
            ' instead of just alerts
                    If .Position = 0 Then
                        MsgBox("Already at first entry in this set", , "First Entry")
                    End If
                End If
            End If
        End With
    End Sub

    Private Sub cmdNext_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) _
        Handles cmdNext.Click

        ' Next row
        With Me.cm
            If Not (cm Is Nothing) Then
                If .Count AndAlso .Position < .Count - 1 Then
                    .Position += 1
                Else
                    If .Position = .Count - 1 Then
                        MsgBox("Already at last entry in this set.", _ 
                , "Last Entry")
                    End If
                End If
            End If
        End With
    End Sub

    Private Sub cmdLast_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) _
     Handles cmdLast.Click

        ' Last Row
        With Me.cm
            If Not (Me.cm Is Nothing) AndAlso .Count Then .Position = .Count - 1
        End With
    End Sub
    
    public function checkNumericTextForNull(txtTemp as Textbox, _
        strFieldNameInDataSet as String) as boolean

    dim bReturn as boolean = false

    If Me.txtTemp.Text.Length = 0 Then
        bReturn = True

        ' need to capture this separately so that we can 
        ' push a null into the dataset
        ' if the textbox has an empty string.
        If Not Me.cm Is Nothing Then
            Me.dsTemp.Tables(0).Rows(Me.cm.Position).Item(strFieldNameInDataSet) _
                = DBNull.Value
        End If
    End If

    return bReturn    ' true if we inserted a null
    end function