tab in datagrid

When a user hits the tab control in a datagrid, i would like it to go to the next row, not the next coloumn in the dg.

Does anyone have an override for this??  
LVL 34
flavoAsked:
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.

prakash_prkCommented:
0
flavoAuthor Commented:
hmm.. not sure if it will work, i removed all my textBox controls from the dg to stop the editing
0
prakash_prkCommented:
Try this
------------------
Class MyGrid
    Inherits System.Windows.Forms.DataGrid
    Private Const WM_KEYDOWN = &H100

    Protected Overrides Function ProcessDialogKey(ByVal keyData As System.Windows.Forms.Keys) As Boolean
        If (keyData = Keys.Tab) Then

            Me.CurrentRowIndex = Me.CurrentRowIndex + 1
            'Me.CurrentCell = New DataGridCell(Me.CurrentRowIndex, 0)
            Return True ' //ignore it
        End If
        Return MyBase.ProcessDialogKey(keyData)
    End Function
End Class
---------------
Regrads
prakash
0
Cloud Class® Course: Python 3 Fundamentals

This course will teach participants about installing and configuring Python, syntax, importing, statements, types, strings, booleans, files, lists, tuples, comprehensions, functions, and classes.

flavoAuthor Commented:
Ill test when i get home!

Thanks

Dave
0
prakash_prkCommented:
Ok flavo
0
flavoAuthor Commented:
ok.. i tested it with

     Protected Overrides Function ProcessDialogKey(ByVal keyData As System.windows.forms.Keys) As Boolean
            If keyData = Keys.Tab Then
                If Me.CurrentRowIndex = -1 Then
                    Me.CurrentRowIndex = 1
                ElseIf Me.CurrentRowIndex = Me.VisibleRowCount Then
                    'do nothing
                Else
                    Me.CurrentRowIndex = Me.CurrentRowIndex + 1
                    Return True
                End If
            End If
            Return MyBase.ProcessDialogKey(keyData)
        End Function

sort of works within the dg, but id like it to got back to the control with a tab index of 1 when it gets to the end..

Can this be done?

Dave
0
prakash_prkCommented:
Try this
------------------
Class MyGrid
    Inherits System.Windows.Forms.DataGrid
    Private Const WM_KEYDOWN = &H100
    Private FirstControl As Control

    Public Sub New(ByRef FirstControl As Control)
        MyBase.New()
        Me.FirstControl = FirstControl
    End Sub
    Protected Overrides Function ProcessDialogKey(ByVal keyData As System.Windows.Forms.Keys) As Boolean
        If (keyData = Keys.Tab) Then

            If Me.CurrentRowIndex = -1 Then
                Me.CurrentRowIndex = 1
                Return True
            ElseIf Me.CurrentRowIndex = Me.VisibleRowCount - 2 Then
                Me.FirstControl.Focus()
                Return True
            Else
                Me.CurrentRowIndex = Me.CurrentRowIndex + 1
                Return True
            End If
            Return True ' //ignore it
        End If
        Return MyBase.ProcessDialogKey(keyData)
    End Function
End Class
------------------------------------------
Regards
Prakash
0

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
flavoAuthor Commented:
>>Me.FirstControl.Focus()
Yeah, but the Me imply's the datagrid, not the form in which it "lives"

Dave
0
prakash_prkCommented:
Create the the datagrid object with this sytax

dim mygrid1 as new MyGrid(Me.TextBox1)

pass the first control to MyGrid Constructor's first argument

Regards
Prakash
0
flavoAuthor Commented:
ahhhh... didnt see that, that's why it bombed out...

Ill test when i get home!

Thanks
0
prakash_prkCommented:
Ok dave

Regards
Prakash
0
flavoAuthor Commented:
nope no good.  Object Not set to an instance of an object or whatever it says..
0
flavoAuthor Commented:
seems harder than i though...  500 it is!
0
prakash_prkCommented:
Can you post your code ..

Regards
Prakash
0
flavoAuthor Commented:
Component class

Option Strict Off
Option Explicit On

Imports Microsoft.VisualBasic
Imports System
Imports System.Drawing
Imports System.Windows.Forms



Public Class customDG
    Inherits System.ComponentModel.Component

#Region " Component Designer generated code "

    Public Sub New(ByVal Container As System.ComponentModel.IContainer)
        MyClass.New()

        'Required for Windows.Forms Class Composition Designer support
        Container.Add(Me)
    End Sub

    Public Sub New()
        MyBase.New()

        'This call is required by the Component Designer.
        InitializeComponent()

        'Add any initialization after the InitializeComponent() call

    End Sub

    'Component overrides dispose to clean up the component list.
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If Not (components Is Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)
    End Sub

    'Required by the Component Designer
    Private components As System.ComponentModel.IContainer

    'NOTE: The following procedure is required by the Component Designer
    'It can be modified using the Component Designer.
    'Do not modify it using the code editor.
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
        components = New System.ComponentModel.Container
    End Sub

#End Region

    Public Class MyDataGrid
        Inherits DataGrid
        Private FirstControl As Control
        Private oldSelectedRow As Integer
        'Fields
        'Constructors
        'Events
        'Methods
        Public Sub New()
            'Warning: Implementation not found
        End Sub

        Protected Overloads Overrides Sub OnMouseMove(ByVal e As MouseEventArgs)
            'don't call the base class if left mouse down
            If (e.Button <> MouseButtons.Left) Then
                MyBase.OnMouseMove(e)
            End If
        End Sub

        Protected Overloads Overrides Sub OnMouseUp(ByVal e As MouseEventArgs)
            'don't call the base class if left mouse down
            If e.Button <> MouseButtons.Left Then
                Exit Sub
            End If
            'don't call the base class if in header
            Try
                Dim hti As DataGrid.HitTestInfo
                hti = Me.HitTest(New Point(e.X, e.Y))
                If (hti.Type = DataGrid.HitTestType.Cell) Then
                    If (oldSelectedRow > -(1)) Then
                        Me.UnSelect(oldSelectedRow)
                    End If
                    oldSelectedRow = -(1)
                    MyBase.OnMouseUp(e)
                Else
                    If (hti.Type = DataGrid.HitTestType.RowHeader) Then
                        If (oldSelectedRow > -(1)) Then
                            Me.UnSelect(oldSelectedRow)
                        End If
                        If ((Control.ModifierKeys And Keys.Shift) _
                                    = 0) Then
                            MyBase.OnMouseUp(e)
                        Else
                            Me.CurrentCell = New DataGridCell(hti.Row, hti.Column)
                        End If
                        Me.Select(hti.Row)
                        oldSelectedRow = hti.Row
                    End If
                End If

                Dim pt = New Point(e.X, e.Y)
                If hti.Type = DataGrid.HitTestType.Cell Then
                    Me.CurrentCell = New DataGridCell(hti.Row, hti.Column)
                    Me.Select(hti.Row)
                End If
            Catch
                'used for the case when the row that was last selected is now deleted - ie remove year form
            End Try
        End Sub

   
        Public Sub New(ByRef FirstControl As Control)
            MyBase.New()
            Me.FirstControl = FirstControl
        End Sub
        Protected Overrides Function ProcessDialogKey(ByVal keyData As System.Windows.Forms.Keys) As Boolean
            If (keyData = Keys.Tab) Then

                If Me.CurrentRowIndex = -1 Then
                    Me.CurrentRowIndex = 1
                    Return True
                ElseIf Me.CurrentRowIndex = Me.VisibleRowCount - 2 Then
                    Me.FirstControl.Focus()
                    Return True
                Else
                    Me.CurrentRowIndex = Me.CurrentRowIndex + 1
                    Return True
                End If
                Return True ' //ignore it
            End If
            Return MyBase.ProcessDialogKey(keyData)
        End Function
    End Class

End Class


form1 class - bits we are interested in

   Friend WithEvents dgLineItems As customDG.MyDataGrid

'......

 Me.dgLineItems = New customDG.MyDataGrid(Me.cboTaxYear)

dave
0
prakash_prkCommented:
your codes runs on my machine well.

Can you say which line you get the error

Prakash
0
flavoAuthor Commented:
It dies when i tab trough the controls, the loop trough all the controls back to the datagrid again
0
prakash_prkCommented:
please check are you have codes like this . if yes remove it.
 Me.dgLineItems = New customDG.MyDataGrid()

please post the complete error message.

Regards
Prakash
0
flavoAuthor Commented:
ok... Ill belive you mate... Im too tired.

Thanks for all your help, i cant belive it took me this long to get this!

Dave
0
prakash_prkCommented:


Thank you flavo

Reagards
Prakash
0
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.