Von ListViews kenne ich es, dass, sofern die Eigenschaft 'HideSelection' auf False steht, beim Verlassen des ListViews die Selektion einer Zeile erhalten bleibt, jedoch andersfarbig. Dadurch erkennt man die zuletzt selektierte Zeile, hat aber nicht den Eindruck, dass die Zeile bzw. das Listview noch den Focus haben.
Mir ist aufgefallen, das DataGridViews dieses Verhalten nicht zeigen, beim Verlassen eines DGV bleibt die Selektion mit der "vollen" 'SelectionBackColor' erhalten. Setzt man den Focus in ein weiteres DGV, sieht es so aus, als ob beide DGV's den Focus haben. Trotz einiger Recherchen fand ich keinen Weg, dieses mit "Bordmitteln" zu ändern (was nicht heißt, dass es nicht doch irgendwelche Wege dafür gibt). Daher ist folgende Lösung entstanden:
Zunächst habe ich eine Erweiterungsmethode für das DataGridView geschrieben:
Übergeben werden an diese Methode das DataGridView selbst und die Parameter selColor und markColor
selColor vertritt die Selektionsfarbe, wenn das DGV den Focus hat,
markColor vertritt die Selektionsfarbe, wenn das DGV den Focus nicht hat
Die If-Anweisung prüft, ob das DGV den Focus hat und im Then-Zweig werden die Selektionsfarben entsprechend definiert. Der Else-Zweig stellt die alternativen Selektionsfarben ein.
Die zweite If-Then-Anweisung dient der Möglichkeit, die Selektion des DGV nach Focusverlust vollständig aufzuheben. Color.Transparent hat keine sichtbaren Auswirkungen auf die SelectionBackColor (die zuletzt eingestellten Farben werden durch Transparent ja nicht verdeckt) , so dass dieser Farbwert dazu hergenommen wird, um ein 'ClearSelection' auszuführen. Bei allen anderen Farbwerten im Parameter markColor wird der Else-Zweig ausgeführt.
Die Definition der SelectionForeColor sollte passend zu BackColor erfolgen. Im Beispiel habe ich schwarz gewählt.
Angewendet wird die Erweiterungsmethode sinnvoller weise in den Ereignissen DataGridView.Enter -u. .Leave:
Bei Enter hat das DGV den Focus bereits erhalten, bei Leave bereits verloren, so dass in der Erweiterungsmethode sicher greift.
Die auskommentierte Zeile in dgv_attach_Leave wird durch die oben erklärte Anwendung von Color.Transparent überflüssig.
Für die erstmalige Fokussierung eines DGV's und Einstellung der Farben kann wie folgt vorgegangen werden (Shown tritt nur bei erstmaligen Anzeigen eines Forms ein):
Ich hoffe, ich habe alles vernünftig erklärt und der Tipp ist für jemandem von Nutzen.
Mir ist aufgefallen, das DataGridViews dieses Verhalten nicht zeigen, beim Verlassen eines DGV bleibt die Selektion mit der "vollen" 'SelectionBackColor' erhalten. Setzt man den Focus in ein weiteres DGV, sieht es so aus, als ob beide DGV's den Focus haben. Trotz einiger Recherchen fand ich keinen Weg, dieses mit "Bordmitteln" zu ändern (was nicht heißt, dass es nicht doch irgendwelche Wege dafür gibt). Daher ist folgende Lösung entstanden:
Zunächst habe ich eine Erweiterungsmethode für das DataGridView geschrieben:
VB.NET-Quellcode
- <Extension()> _
- Public Sub ChangeSelectionBackColor(Of T As DataGridView)(ByVal dgv As DataGridView, ByVal selColor As Color, ByVal markColor As Color)
- If dgv.Focused Then
- dgv.DefaultCellStyle.SelectionBackColor = selColor
- dgv.DefaultCellStyle.SelectionForeColor = Color.Black
- Else
- If markColor = Color.Transparent Then
- dgv.ClearSelection()
- Else
- dgv.DefaultCellStyle.SelectionBackColor = markColor
- dgv.DefaultCellStyle.SelectionForeColor = Color.Black
- End If
- End If
- End Sub
Übergeben werden an diese Methode das DataGridView selbst und die Parameter selColor und markColor
selColor vertritt die Selektionsfarbe, wenn das DGV den Focus hat,
markColor vertritt die Selektionsfarbe, wenn das DGV den Focus nicht hat
Die If-Anweisung prüft, ob das DGV den Focus hat und im Then-Zweig werden die Selektionsfarben entsprechend definiert. Der Else-Zweig stellt die alternativen Selektionsfarben ein.
Die zweite If-Then-Anweisung dient der Möglichkeit, die Selektion des DGV nach Focusverlust vollständig aufzuheben. Color.Transparent hat keine sichtbaren Auswirkungen auf die SelectionBackColor (die zuletzt eingestellten Farben werden durch Transparent ja nicht verdeckt) , so dass dieser Farbwert dazu hergenommen wird, um ein 'ClearSelection' auszuführen. Bei allen anderen Farbwerten im Parameter markColor wird der Else-Zweig ausgeführt.
Die Definition der SelectionForeColor sollte passend zu BackColor erfolgen. Im Beispiel habe ich schwarz gewählt.
Angewendet wird die Erweiterungsmethode sinnvoller weise in den Ereignissen DataGridView.Enter -u. .Leave:
VB.NET-Quellcode
- Private Sub dgv_attach_Enter(sender As Object, e As EventArgs) Handles dgv_attach.Enter
- Me.dgv_attach.ChangeSelectionBackColor(Of DataGridView)(Color.Orange, Me.BackColor)
- End Sub
- Private Sub dgv_attach_Leave(sender As Object, e As EventArgs) Handles dgv_attach.Leave
- 'Me.dgv_attach.ClearSelection()
- Me.dgv_attach.ChangeSelectionBackColor(Of DataGridView)(Color.Orange, Color.Transparent)
- End Sub
Bei Enter hat das DGV den Focus bereits erhalten, bei Leave bereits verloren, so dass in der Erweiterungsmethode sicher greift.
Die auskommentierte Zeile in dgv_attach_Leave wird durch die oben erklärte Anwendung von Color.Transparent überflüssig.
Für die erstmalige Fokussierung eines DGV's und Einstellung der Farben kann wie folgt vorgegangen werden (Shown tritt nur bei erstmaligen Anzeigen eines Forms ein):
Ich hoffe, ich habe alles vernünftig erklärt und der Tipp ist für jemandem von Nutzen.
GUD Uwe
Wenn ich genau wüsste, was ich nicht weiß, dann wäre mein Wissen vollständig!
Wenn ich genau wüsste, was ich nicht weiß, dann wäre mein Wissen vollständig!