Hi,
ich habe eine Datagridview .... die hat den SelectionMode "FullRowsSelect", MulitiRowSelect ist false, die Row Header sind nicht sichtbar und man kann die dgv sortieren.
Wenn eine Zeile ausgewählt ist, und ich den Header einer Spalte anklicke, dann wird nach dieser Spalte sortiert und die ausgewählte Zeile bleibt selektiert.
So far so good !
Ich kann aber auch die Selektion der Zeile aufheben, indem ich mit der rechten Mouse die dgv klicke ... dann wird ein dgv.ClearSelection ausgeführt und keine Zeile ist ausgewählt.
Wenn ich jetzt den Header einer Spalte anklicke, wird zwar sortiert ... aber ... die vormals ausgewählte Zeile, wird erneut ausgewählt. Die Selection erscheint sozusagen wie ein Phoenix aus der Asche !
Ich hab das folgende Coding, um den Effekt zu demonstrieren:
Zunächst wähle ich die Zeile mit i=2 aus, die enthält den Buchstaben "C". (s.SortDgv01.jpg)
Debug.Print zeigt:
SelectionChanged: i=2
Ich drücke dann die rechte Maustaste und löse damit DatagridView1.ClearSelection() aus. (s. SortDgv02.jpg)
Debug.Print zeigt
MouseClick: i=2
SelectionChanged: i=-1
MouseClick: i=-1
Jetzt klicke ich den Header der ersten und einzigen Spalte ... die Sortierung wird umgekehrt und die Selection der Zeile mit i=2 wird restauriert !!!!! (s. SortDgv03.jpg)
Debug.Print zeigt:
SelectionChanged: i=5
Sorted: i=5
ColumnHeaderMouseClick: i=5
i=5 ist der Index der Zeile, die "C" enthält, NACH der Sortierung. Und diese Selection wird ausgelöst, bevor das Ereignis "Sorted" ausgeführt wird.
Ich hoffe, ihr habt mir folgen können.
Irgendwo muss sich .NET die einstmals selektierte Zeile merken und die Selektion nach dem Sort wieder restaurieren.
Vermutlich ist die Sache ganz einfach ... aber ich komme ums Verplatzen nicht drauf, wo der Fehler liegt.
Kann mir jemand nachsichtig helfen ?
LG
Peter
ich habe eine Datagridview .... die hat den SelectionMode "FullRowsSelect", MulitiRowSelect ist false, die Row Header sind nicht sichtbar und man kann die dgv sortieren.
Wenn eine Zeile ausgewählt ist, und ich den Header einer Spalte anklicke, dann wird nach dieser Spalte sortiert und die ausgewählte Zeile bleibt selektiert.
So far so good !
Ich kann aber auch die Selektion der Zeile aufheben, indem ich mit der rechten Mouse die dgv klicke ... dann wird ein dgv.ClearSelection ausgeführt und keine Zeile ist ausgewählt.
Wenn ich jetzt den Header einer Spalte anklicke, wird zwar sortiert ... aber ... die vormals ausgewählte Zeile, wird erneut ausgewählt. Die Selection erscheint sozusagen wie ein Phoenix aus der Asche !
Ich hab das folgende Coding, um den Effekt zu demonstrieren:
VB.NET-Quellcode
- Public Class Form1
- Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
- DataGridView1.Rows.Add("A")
- DataGridView1.Rows.Add("B")
- DataGridView1.Rows.Add("C")
- DataGridView1.Rows.Add("D")
- DataGridView1.Rows.Add("E")
- DataGridView1.Rows.Add("F")
- DataGridView1.Rows.Add("G")
- DataGridView1.Rows.Add("H")
- End Sub
- Private Sub DataGridView1_MouseClick(sender As Object, e As MouseEventArgs) Handles DataGridView1.MouseClick
- Dim i As Integer = -1
- If DataGridView1.SelectedRows.Count > 0 Then i = DataGridView1.SelectedRows(0).Index
- Debug.Print("MouseClick: i=" & i.ToString)
- If e.Button = MouseButtons.Right Then DataGridView1.ClearSelection()
- End Sub
- Private Sub DataGridView1_Sorted(sender As Object, e As EventArgs) Handles DataGridView1.Sorted
- Dim i As Integer = -1
- If DataGridView1.SelectedRows.Count > 0 Then i = DataGridView1.SelectedRows(0).Index
- Debug.Print("Sorted: i=" & i.ToString)
- End Sub
- Private Sub DataGridView1_SelectionChanged(sender As Object, e As EventArgs) Handles DataGridView1.SelectionChanged
- Dim i As Integer = -1
- If DataGridView1.SelectedRows.Count > 0 Then i = DataGridView1.SelectedRows(0).Index
- Debug.Print("SelectionChanged: i=" & i.ToString)
- End Sub
- Private Sub DataGridView1_ColumnHeaderMouseClick(sender As Object, e As DataGridViewCellMouseEventArgs) Handles DataGridView1.ColumnHeaderMouseClick
- Dim i As Integer = -1
- If DataGridView1.SelectedRows.Count > 0 Then i = DataGridView1.SelectedRows(0).Index
- Debug.Print("ColumnHeaderMouseClick: i=" & i.ToString)
- End Sub
Zunächst wähle ich die Zeile mit i=2 aus, die enthält den Buchstaben "C". (s.SortDgv01.jpg)
Debug.Print zeigt:
SelectionChanged: i=2
Ich drücke dann die rechte Maustaste und löse damit DatagridView1.ClearSelection() aus. (s. SortDgv02.jpg)
Debug.Print zeigt
MouseClick: i=2
SelectionChanged: i=-1
MouseClick: i=-1
Jetzt klicke ich den Header der ersten und einzigen Spalte ... die Sortierung wird umgekehrt und die Selection der Zeile mit i=2 wird restauriert !!!!! (s. SortDgv03.jpg)
Debug.Print zeigt:
SelectionChanged: i=5
Sorted: i=5
ColumnHeaderMouseClick: i=5
i=5 ist der Index der Zeile, die "C" enthält, NACH der Sortierung. Und diese Selection wird ausgelöst, bevor das Ereignis "Sorted" ausgeführt wird.
Ich hoffe, ihr habt mir folgen können.
Irgendwo muss sich .NET die einstmals selektierte Zeile merken und die Selektion nach dem Sort wieder restaurieren.
Vermutlich ist die Sache ganz einfach ... aber ich komme ums Verplatzen nicht drauf, wo der Fehler liegt.
Kann mir jemand nachsichtig helfen ?
LG
Peter