Im Datagridview Tastenverhalten von Return genauso wie Tab

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Wolfy.

    Im Datagridview Tastenverhalten von Return genauso wie Tab

    Hallo ich mal wieder,

    ich habe ein Datagridview über Datenquellen hinzugefügt.
    So weit, so gut.
    Nun möchte ich das sich die Textboxen des DGV bei ENTER so verhalten wie TAB.
    Ok: ich kann es über das KeyDown Ereignis der TextboxColumn machen. Funktioniert auch (so habe ich es bisher gemacht).
    Da ich nun 25 Spalten habe ... > viel schreiberei und Code.
    Kann man das einfacher machen ?

    Habe etwas gefunden: über EditingControlShowing.
    Hier mein Code:

    VB.NET-Quellcode

    1. ​#Region "Enter handling in DGV"
    2. Private Sub DetailsDataGridView_EditingControlShowing(ByVal sender As Object, ByVal e As DataGridViewEditingControlShowingEventArgs) Handles DetailsDataGridView.EditingControlShowing
    3. Dim tb As TextBox = CType(e.Control, TextBox)
    4. KeyPreview = False
    5. AddHandler tb.PreviewKeyDown, AddressOf TextBox_PreviewKeyDown
    6. End Sub
    7. Private Sub TextBox_PreviewKeyDown(ByVal sender As Object, ByVal e As PreviewKeyDownEventArgs)
    8. If e.KeyCode = Keys.Enter Or e.KeyCode = Keys.Return Then
    9. Dim rwIndex As Integer = Me.DetailsDataGridView.CurrentCell.RowIndex
    10. Dim colIndex As Integer = Me.DetailsDataGridView.CurrentCell.ColumnIndex
    11. Dim newRow As Integer = 0
    12. Dim newCol As Integer = 2
    13. If colIndex = DetailsDataGridView.ColumnCount Then
    14. newRow = Me.DetailsDataGridView.CurrentCell.RowIndex + 1
    15. If newRow = Me.DetailsDataGridView.RowCount Then
    16. Return
    17. End If
    18. Else
    19. newRow = Me.DetailsDataGridView.CurrentCell.RowIndex
    20. newCol = colIndex + 1
    21. End If
    22. 'For i = 0 To DetailsDataGridView.ColumnCount - 1
    23. ' Debug.Print("Index: " & i & " Name: " & DetailsDataGridView.Columns(i).HeaderText)
    24. 'Next
    25. KeyPreview = False
    26. Me.DetailsDataGridView.CurrentCell = Me.DetailsDataGridView.Rows(newRow).Cells(newCol)
    27. 'SendKeys.Send("{tab}")
    28. End If
    29. KeyPreview = False
    30. End Sub
    31. #End Region


    Funktioniert !
    Aber...
    Nach dem ersten Enter wird die nächste Spalte genommen. Beim 2. Enter wird die übernächste Spalte genommen. und so weiter.
    Ich weiß nicht wo ich was leeren muß, damit er wirklich die nächste Spalte nimmt.
    Apps. die Sub TextBox_PreviewKeyDown wird beim 2. Enter 2 mal durchlaufen etc. daher kommt das. Aber warum durchläuft er das aufsummiert. Muß ich irgendwo den Tastaturpuffer leeren?

    für nen Tip wäre ich sehr dankbar.

    Groß Wolfy
    Gegenfrage: Wo machst Du denn mal das AddHandler-Gegenstück: RemoveHandler? Denn sonst könnte es passieren, dass der EventHandler mehrfach zugeordnet und somit auch mehrfach aufgerufen wird.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Wolfy schrieb:

    Der doch sonst nicht mehr da
    Wenn Du Dir da absolut sicher bist … ;)
    Probier einfach mal und berichte. Deklariere die TextBox nicht lokal, sondern klassenweit. Und im CellEndEdit-EventHandler: If tb IsNot Nothing Then RemoveHandler tb.PreviewKeyDown, AddressOf TextBox_PreviewKeyDown
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VB1963
    Danke für den Link. Naja : passende Such Wörter.
    Aber Klasse und funzt.
    Nur : wie verwende ich das EnterNextDGV wenn ich über Datenquellen ein DGV hinzufüge? Wo, wann kann ich dann das DGV austauschen damit ich die Funktion habe?

    Ok. Habe Probiert im DesignerCode das DGV auszutauschen.... Es klappt. :D
    Ich hatte befürchtet das er mir den Code wieder ändert oder meckert.

    @VaporiZed
    Neee. Bin überhaupt nicht sicher. So war (ist) meine Denkweise. Lehrne noch viel und vieles werde ich wohl nie verstehen.
    Würde es gerne probieren, aber wie deklariere ich eine TextBox aus den DGV Klassenweit.

    Gruß Wolfy

    Update:
    Manchmal steht man selbst auf der Leitung.
    Mit der TextBox Deklaration hast du die Variable gemeint. Grr.
    Dann funktioniert alles wie gedacht. Mit Deinem RemoveHandler.

    Leider nur wenn man wirklich editiert. Wenn man in der neuen Spalte keine Änderung vornimmt und dann Enter drückt, wandert der Focus doch in die nächste Zeile.
    Also doch die Lösung von VB1963 oder für jede TextBoxColumn eine KeyDown Sub machen!?

    nochmals Danke!!!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Wolfy“ ()

    Wolfy schrieb:


    Nur : wie verwende ich das EnterNextDGV wenn ich über Datenquellen ein DGV hinzufüge?

    Wenn du dich im geöffneten Formdesigner befindest, kannst du über das Datenquellenfenster dein neues DGV einstellen...

    Du brauchst da nur die Combobox aufklappen und dein gewünschtes DGV auswählen oder über das Menü Anpassen... dein neues DGV voreinstellen.