I created a control in vb.net that is kind of a DataGridView. In this control are added values in real time, especially every 10 seconds the data within the control are updated. Now my problem is the following: let's say that the user is viewing a given value that is present at the center of the control, when the component is updated, scroll back up. This of course is normal because the user have added or updated data, but it is also frustrating because the user must place the scrolling back to the previous position. Is there a way to lock the position of the scrolling even after the refresh of the component?

IMAGE EXAMPLE: http://www.mediafire.com/convkey/1d5...fdvdga4jzg.jpg
CONTROL CLASS:

Code:
Imports System.ComponentModel
Imports System.Drawing
Public Class gdkList
Inherits Control
Private Selected As Color = Color.FromArgb(My.Settings.colore, My.Settings.menu_colore_1, My.Settings.menu_colore_2)

Private Line_Color As Color = Color.DeepSkyBlue
Private Scroll_Color As Color = Color.DeepSkyBlue
Private Scroll_Hover_Color As Color = Color.FromArgb(My.Settings.colore, My.Settings.menu_colore_1, My.Settings.menu_colore_2)
Private Bar_Fore_Color As Color
Public Structure ListItem
    Public Text As String
    Public ForeColor As Color
    Public Header As Boolean
End Structure
Private LstItems As New List(Of ListItem)()
Private Tile_Height As Integer = 32
Private Selected_Index As Integer = -1

Private Selected_Index_Total As Integer = -1
Private Scroll_Y As Integer
Private Scroll_Bar_Y As Integer

Private Scroll_Bar_Height As Integer = 64
Private Mouse_Position As Point
Private Scroll_Mouse_Y As Integer
Private Mouse_Drag As Boolean

Private Clicked As Boolean
Public Sub New()
    Me.DoubleBuffered = True
    SetStyle(ControlStyles.AllPaintingInWmPaint Or ControlStyles.DoubleBuffer Or ControlStyles.ResizeRedraw Or ControlStyles.UserPaint Or ControlStyles.OptimizedDoubleBuffer Or ControlStyles.SupportsTransparentBackColor, True)
End Sub
Public Property TileHeight() As Integer
    Get
        Return Tile_Height
    End Get
    Set(value As Integer)
        Tile_Height = value
    End Set
End Property
Public Property SelectedIndex() As Integer
    Get
        Return Selected_Index
    End Get
    Set(value As Integer)
        Selected_Index = value
    End Set
End Property
Public Property ScrollColor() As Color
    Get
        Return Scroll_Color
    End Get
    Set(value As Color)
        Scroll_Color = value
        Bar_Fore_Color = Scroll_Color
    End Set
End Property
Public Property ScrollHoverColor() As Color
    Get
        Return Scroll_Hover_Color
    End Get
    Set(value As Color)
        Scroll_Hover_Color = value
    End Set
End Property
Public Property SelectionColor() As Color
    Get
        Return Selected
    End Get
    Set(value As Color)
        Selected = value
    End Set
End Property
Public Property LineColor() As Color
    Get
        Return Line_Color
    End Get
    Set(value As Color)
        Line_Color = value
    End Set
End Property
Public Sub AddItem(Text As String, FgColor As Color, Optional Header As Boolean = False)
    Dim Item As ListItem = Nothing
    Item.Text = Text
    Item.ForeColor = FgColor
    Item.Header = Header
    LstItems.Add(Item)
End Sub
Public Sub AddItem(Item As ListItem)
    LstItems.Add(Item)
End Sub
Public Sub ChangeItem(Index As Integer, Item As ListItem)
    Dim Temp As ListItem() = LstItems.ToArray()
    Dim j As Integer = 0
    For i As Integer = 0 To Temp.Length - 1
        If Not Temp(i).Header Then
            If j = Index Then
                Temp(i) = Item
                Exit For
            End If
            j += 1
        End If
    Next
    LstItems.Clear()
    LstItems.AddRange(Temp)
    Me.Refresh()
End Sub
Public Function GetItemText(Index As Integer) As String
    Dim Temp As ListItem() = LstItems.ToArray()
    Dim j As Integer = 0
    For i As Integer = 0 To Temp.Length - 1
        If Not Temp(i).Header Then
            If j = Index Then
                Return Temp(i).Text
            End If
            j += 1
        End If
    Next
    Return Nothing
End Function
Public Sub Clear()
    LstItems.Clear()
    Selected_Index = -1
    Scroll_Y = 0
    Scroll_Bar_Y = 0
    Me.Refresh()
End Sub
Protected Overrides Sub OnPaint(e As PaintEventArgs)
    If LstItems.Count = 0 Then Return
    e.Graphics.FillRectangle(New SolidBrush(Me.BackColor), e.ClipRectangle)

    If LstItems IsNot Nothing Then
        Dim Total_Size As Integer = LstItems.Count * Tile_Height
        Dim Start_Y As Integer = 0
        If Total_Size > Me.Height Then
            Start_Y = Scroll_Y * -1
        End If
        Dim Total_Index As Integer = 0
        Dim Index As Integer = 0

        For Each Item As ListItem In LstItems
            'Item selecionado (e detecção de click no Item)
            If Start_Y >= -Tile_Height Then
                If Start_Y > Me.Height Then Exit For
                If Not Item.Header Then
                    If Clicked Then
                        Dim Item_Rect As New Rectangle(0, Start_Y, Me.Width, TileHeight)
                        Dim Mouse_Rect As New Rectangle(Mouse_Position, New Size(1, 1))
                        'Selecionado
                        If Item_Rect.IntersectsWith(Mouse_Rect) Then
                            Clicked = False
                            e.Graphics.FillRectangle(New SolidBrush(Selected), New Rectangle(0, Start_Y, Me.Width, TileHeight))
                            Selected_Index = Index
                            Selected_Index_Total = Total_Index
                            RaiseEvent SelectedIndexChanged(Index)
                        End If
                    Else
                        If Index = Selected_Index Then
                            e.Graphics.FillRectangle(New SolidBrush(Selected), New Rectangle(0, Start_Y, Me.Width, TileHeight))
                        End If
                    End If
                End If

                'Textos e afins
                Dim TxtHeight As Integer = Convert.ToInt32(e.Graphics.MeasureString(Item.Text, Me.Font).Height)
                If Item.Text IsNot Nothing Then
                    e.Graphics.DrawString(Item.Text, Me.Font, New SolidBrush(Item.ForeColor), New Point(0, (Start_Y + (Tile_Height / 2) - (TxtHeight / 2))))
                End If

                If Item.Header Then
                    Dim X As Integer = Me.Width - 1
                    Dim Y As Integer = Start_Y + Tile_Height - 1
                    e.Graphics.DrawLine(New Pen(Line_Color), New Point(0, Y), New Point(X, Y))
                    e.Graphics.DrawLine(New Pen(Line_Color), New Point(X, Start_Y), New Point(X, Y))
                End If
            End If

            Start_Y += Tile_Height
            If Not Item.Header Then
                Index += 1
            End If
            Total_Index += 1
        Next

        'Barra de rolagem
        If Total_Size > Me.Height Then
            e.Graphics.FillRectangle(New SolidBrush(Bar_Fore_Color), New Rectangle(Me.Width - 10, Scroll_Bar_Y, 10, Scroll_Bar_Height - 1))
        End If
    End If

    MyBase.OnPaint(e)
End Sub
Protected Overrides Sub OnMouseEnter(e As EventArgs)
    Me.Focus()

    MyBase.OnMouseEnter(e)
End Sub
Protected Overrides Sub OnMouseDown(e As MouseEventArgs)
    If e.Button = System.Windows.Forms.MouseButtons.Left Then
        Dim Scroll_Rect As New Rectangle(Me.Width - 10, Scroll_Bar_Y, 10, Scroll_Bar_Height)
        If Scroll_Rect.IntersectsWith(New Rectangle(e.X, e.Y, 1, 1)) Then
            Scroll_Mouse_Y = e.Y - Scroll_Bar_Y
            Mouse_Drag = True
        Else
            Dim Index As Integer = e.Y \ Tile_Height
            If Index > -1 And Index < LstItems.Count Then
                If Not LstItems(Index).Header Then
                    Clicked = True
                    Mouse_Position = e.Location
                    Me.Refresh()
                End If
            End If
        End If
    End If

    MyBase.OnMouseDown(e)
End Sub
Protected Overrides Sub OnMouseUp(e As MouseEventArgs)
    Me.Focus()
    If e.Button = System.Windows.Forms.MouseButtons.Left Then
        Mouse_Drag = False
    End If

    MyBase.OnMouseUp(e)
End Sub
Protected Overrides Sub OnMouseMove(e As MouseEventArgs)
    Dim Scroll_Rect As New Rectangle(Me.Width - 10, Scroll_Bar_Y, 10, Scroll_Bar_Height)
    If Scroll_Rect.IntersectsWith(New Rectangle(e.X, e.Y, 1, 1)) Then
        If Bar_Fore_Color <> Scroll_Hover_Color Then
            Bar_Fore_Color = Scroll_Hover_Color
            Me.Refresh()
        End If
    ElseIf Not Mouse_Drag Then
        If Bar_Fore_Color <> Scroll_Color Then
            Bar_Fore_Color = Scroll_Color
            Me.Refresh()
        End If
    End If

    If e.Button = System.Windows.Forms.MouseButtons.Left And Mouse_Drag Then
        Dim Y As Integer = e.Y - Scroll_Mouse_Y
        If Y < 0 Then
            Y = 0
        ElseIf Y > Me.Height - Scroll_Bar_Height Then
            Y = Me.Height - Scroll_Bar_Height
        End If
        Scroll_Bar_Y = Y

        Dim Total_Size As Integer = LstItems.Count * Tile_Height
        Scroll_Y = Convert.ToInt32((CSng(Y) / (Me.Height - Scroll_Bar_Height)) * (Total_Size - Me.Height))
        Me.Refresh()
    End If

    MyBase.OnMouseMove(e)
End Sub
Protected Overrides Sub OnMouseWheel(e As MouseEventArgs)
    Dim Total_Size As Integer = LstItems.Count * Tile_Height
    If e.Delta <> 0 And Total_Size > Me.Height Then
        Dim Y As Integer = 0

        If e.Delta > 0 Then
            Y = Scroll_Bar_Y - 16
        ElseIf e.Delta < 0 Then
            Y = Scroll_Bar_Y + 16
        End If

        If Y < 0 Then
            Y = 0
        ElseIf Y > Me.Height - Scroll_Bar_Height Then
            Y = Me.Height - Scroll_Bar_Height
        End If
        Scroll_Bar_Y = Y

        Scroll_Y = Convert.ToInt32((CSng(Y) / (Me.Height - Scroll_Bar_Height)) * (Total_Size - Me.Height))
        Me.Refresh()
    End If

    MyBase.OnMouseWheel(e)
End Sub
Protected Overrides Sub OnMouseLeave(e As EventArgs)
    If Not Mouse_Drag Then
        Bar_Fore_Color = Scroll_Color
        Me.Refresh()
    End If

    MyBase.OnMouseLeave(e)
End Sub
Protected Overrides Function IsInputKey(keyData As Keys) As Boolean
    Select Case keyData
        Case Keys.Up, Keys.Down, Keys.Left, Keys.Right
            Return True
    End Select
    Return MyBase.IsInputKey(keyData)
End Function
Protected Overrides Sub OnKeyDown(e As KeyEventArgs)
    Dim Total_Size As Integer = LstItems.Count * Tile_Height
    Select Case e.KeyCode
        Case Keys.Up
            If Selected_Index > 0 Then
                Selected_Index -= 1
                Selected_Index_Total -= 1
                RaiseEvent SelectedIndexChanged(Selected_Index)
            End If

            While (Selected_Index_Total * Tile_Height) - Scroll_Y < 0
                Dim Y As Integer = Scroll_Bar_Y - 1
                If Y < 0 Then
                    Y = 0
                End If
                Scroll_Bar_Y = Y
                Scroll_Y = Convert.ToInt32((CSng(Y) / (Me.Height - Scroll_Bar_Height)) * (Total_Size - Me.Height))
                If Y = 0 Then Exit While
            End While
            Exit Select
        Case Keys.Down
            If Selected_Index < Get_Headerless_Length() - 1 Then
                Selected_Index += 1
                Selected_Index_Total += 1
                RaiseEvent SelectedIndexChanged(Selected_Index)
            End If

            While (Selected_Index_Total * Tile_Height) - Scroll_Y > (Me.Height - Tile_Height)
                Dim Y As Integer = Scroll_Bar_Y + 1
                If Y > Me.Height - Scroll_Bar_Height Then
                    Y = Me.Height - Scroll_Bar_Height
                End If
                Scroll_Bar_Y = Y
                Scroll_Y = Convert.ToInt32((CSng(Y) / (Me.Height - Scroll_Bar_Height)) * (Total_Size - Me.Height))
                If Y = Me.Height - Scroll_Bar_Height Then Exit While
            End While
            Exit Select
    End Select

    Me.Refresh()

    MyBase.OnKeyDown(e)
End Sub

Private Function Get_Headerless_Length() As Integer
    Dim j As Integer = 0
    For i As Integer = 0 To LstItems.Count - 1
        If Not LstItems(i).Header Then
            j += 1
        End If
    Next
    Return j
End Function

Public Event SelectedIndexChanged As SelectedIndexChangedEventHandler
Public Delegate Sub SelectedIndexChangedEventHandler(New_Index As Integer)
End Class