Hi,
ich will mal versuchen mein Problem verständlich zu machen. Ich hoffe ihr seid geduldig ....
Ich habe eine Datagridview, deren Zeilen ich per FullRowSelect selektiere.
Wie üblich kann man durch Anklicken einer Zelle in den EditMode wechseln und den Inhalt der Zeile verändern.
Den EditMode kann man (u.a.) durch das Drücken der RETURN oder ENTER Taste wieder beenden.
Soweit so gut. Nun zu meinem Problem:
Wenn man RETURN oder ENTER drückt, wird nicht nur der EditMode beeendet, sondern es wird auch die NÄCHSTE ZEILE selektiert.
Das mag für viele Anwendungen genau das Richtige sein ... in meinem Fall ist das aber nicht erwünscht ! Ich habe mir also Gedanken gemacht, wie ich die selektierte Zeile nach EndEdit beibehalten kann.
Die ausgewählte Zeile kann ich mir im BeginEdit Event als e.rowindex merken. Das ist schon mal gut.
Die Idee, diese Auswahl etwa im EndEdit Event zu restaurieren scheitert aber ... weil im EndEdit das Feld e.rowIndex immer noch auf die gleiche Zeile zeigt ! Offensichtlich erfolgt der Zeilenvorschub erst später.
Was darüber hinaus problematisch ist: Ich erhalte keine Information darüber, ob der EditMode mit ENTER / RETURN beendet wurde (das kann nämlich auch durch die ESC Taste oder einen MausClick erfolgen !)
Ich habe das Ganze in einem kleinen TestProject abgebildet.
Ich ersetze "Hans" durch "Lee"und drücke die RETURN Taste um den Update abzuschließen .... damit erhalte ich das folgende Debug Protokoll:
Die Zeilenauswahl steht danach auf der nächsten Zeile (s. Screenshot).
Wie man sieht habe ich im Debugging weder Informationen über das Drücken der Return Taste noch über den Wechsel auf die Zeile mit dem Index 2.
Wie kann man denn diesen vermaledeiten Zeilenwechsel verhindern ?
Umgehen lässt sich das Problem, indem man den EditMode nicht mit der RETURN Taste beendet, sondern etwa mit der Maus auf ein anderes Feld in der gleichen Zeile klickt. Die meisten Leute sind es aber gewohnt, Änderungen mit RETURN / ENTER zu beenden ... deshalb ist diese Umgehung nicht so gut !
LG
Peter
ich will mal versuchen mein Problem verständlich zu machen. Ich hoffe ihr seid geduldig ....
Ich habe eine Datagridview, deren Zeilen ich per FullRowSelect selektiere.
Wie üblich kann man durch Anklicken einer Zelle in den EditMode wechseln und den Inhalt der Zeile verändern.
Den EditMode kann man (u.a.) durch das Drücken der RETURN oder ENTER Taste wieder beenden.
Soweit so gut. Nun zu meinem Problem:
Wenn man RETURN oder ENTER drückt, wird nicht nur der EditMode beeendet, sondern es wird auch die NÄCHSTE ZEILE selektiert.
Das mag für viele Anwendungen genau das Richtige sein ... in meinem Fall ist das aber nicht erwünscht ! Ich habe mir also Gedanken gemacht, wie ich die selektierte Zeile nach EndEdit beibehalten kann.
Die ausgewählte Zeile kann ich mir im BeginEdit Event als e.rowindex merken. Das ist schon mal gut.
Die Idee, diese Auswahl etwa im EndEdit Event zu restaurieren scheitert aber ... weil im EndEdit das Feld e.rowIndex immer noch auf die gleiche Zeile zeigt ! Offensichtlich erfolgt der Zeilenvorschub erst später.
Was darüber hinaus problematisch ist: Ich erhalte keine Information darüber, ob der EditMode mit ENTER / RETURN beendet wurde (das kann nämlich auch durch die ESC Taste oder einen MausClick erfolgen !)
Ich habe das Ganze in einem kleinen TestProject abgebildet.
VB.NET-Quellcode
- Public Class Form1
- Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
- DataGridView1.Rows.Add("Mueller", "Peter")
- DataGridView1.Rows.Add("Meyer", "Hans")
- DataGridView1.Rows.Add("Schmidt", "Walter")
- DataGridView1.Rows.Add("Schuster", "Kurt")
- DataGridView1.ClearSelection()
- End Sub
- Private Sub DataGridView1_KeyDown(sender As Object, e As KeyEventArgs) Handles DataGridView1.KeyDown
- Debug.Print("KeyDown - " & e.KeyCode.ToString)
- End Sub
- Private Sub DataGridView1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles DataGridView1.KeyPress
- Debug.Print("KeyPress" & e.KeyChar.ToString)
- End Sub
- Private Sub DataGridView1_CellBeginEdit(sender As Object, e As DataGridViewCellCancelEventArgs) Handles DataGridView1.CellBeginEdit
- Debug.Print("CellBeginEdit - Row Index Start: " & e.RowIndex.ToString)
- End Sub
- Private Sub DataGridView1_EditingControlShowing(sender As Object, e As DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing
- If TypeOf e.Control Is DataGridViewTextBoxEditingControl Then
- AddHandler DirectCast(e.Control, DataGridViewTextBoxEditingControl).KeyPress, AddressOf Control_KeyPress
- End If
- End Sub
- Public Sub Control_KeyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs)
- Debug.Print("Control_KeyPress - my Char=" & e.KeyChar.ToString &
- " &H" & Convert.ToString(Convert.ToInt32(e.KeyChar), 16))
- End Sub
- Private Sub DataGridView1_CellEndEdit(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellEndEdit
- Debug.Print("CellEndEdit - Row Index End: " & e.RowIndex.ToString)
- End Sub
- End Class
Ich ersetze "Hans" durch "Lee"und drücke die RETURN Taste um den Update abzuschließen .... damit erhalte ich das folgende Debug Protokoll:
Die Zeilenauswahl steht danach auf der nächsten Zeile (s. Screenshot).
Wie man sieht habe ich im Debugging weder Informationen über das Drücken der Return Taste noch über den Wechsel auf die Zeile mit dem Index 2.
Wie kann man denn diesen vermaledeiten Zeilenwechsel verhindern ?
Umgehen lässt sich das Problem, indem man den EditMode nicht mit der RETURN Taste beendet, sondern etwa mit der Maus auf ein anderes Feld in der gleichen Zeile klickt. Die meisten Leute sind es aber gewohnt, Änderungen mit RETURN / ENTER zu beenden ... deshalb ist diese Umgehung nicht so gut !
LG
Peter
Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Peter329“ ()