Hallo zusammen,
in einem DataGridView soll eine Spalte als ComboBoxColumn definiert werden. Allerdings finde ich es sehr hässlich, dass dabei in jeder einzelnen Zeile die ComboBox als Element angezeigt wird (Column 4 im Screenshot). Ich habe daher nach einem Weg gesucht, nur die gerade aktive Zelle als ComboBox darzustellen und bin schließlich bei der Lösung gelandet, im CellEnter- und CellLeave-Ereignis die jeweilige Zelle als DataGridViewComboBoxCell bzw. als DataGridViewTextBoxCell zu definieren. Das klappt grundsätzlich auch (Column 3). Allerdings tritt dabei in einer Konstellation ein Fehler auf ("Der Vorgang ist ungültig, da er einen Wiedereintrittsaufruf an die SetCurrentCellAddressCore-Funktion zur Folge hat."). Dieser Fehler tritt ausschließlich dann auf, wenn ich mich in die Zeile bewege, die denselben Index wie die betroffene Spalte hat. Also wenn wie in meinem Beispielprojekt in Spalte 3 die ComboBoxCell definiert werden soll, dann tritt der Fehler in Zeile 3 auf. Will ich die ComboBox stattdessen in Spalte 4 definieren, kommt der Fehler, sobald ich Zeile 4 betreten will.
Auch wenn mich schon interessieren würde, was genau da intern schief läuft, würde mir notfalls auch ein alternativer Weg reichen, wie ich das beschriebene Ziel (immer nur die aktuell ausgewählte Zelle als ComboBox darstellen) erreichen kann
Ich nutze VS Studio 2019 Community Edition, installierte .NET-Version 4.8. Unten ein simples Beispielprojekt zum Nachvollziehen - auf der Form befindet sich nur ein DataGridView mit dem Namen grd.
Vielen Dank schon mal vorab!
Matthias
in einem DataGridView soll eine Spalte als ComboBoxColumn definiert werden. Allerdings finde ich es sehr hässlich, dass dabei in jeder einzelnen Zeile die ComboBox als Element angezeigt wird (Column 4 im Screenshot). Ich habe daher nach einem Weg gesucht, nur die gerade aktive Zelle als ComboBox darzustellen und bin schließlich bei der Lösung gelandet, im CellEnter- und CellLeave-Ereignis die jeweilige Zelle als DataGridViewComboBoxCell bzw. als DataGridViewTextBoxCell zu definieren. Das klappt grundsätzlich auch (Column 3). Allerdings tritt dabei in einer Konstellation ein Fehler auf ("Der Vorgang ist ungültig, da er einen Wiedereintrittsaufruf an die SetCurrentCellAddressCore-Funktion zur Folge hat."). Dieser Fehler tritt ausschließlich dann auf, wenn ich mich in die Zeile bewege, die denselben Index wie die betroffene Spalte hat. Also wenn wie in meinem Beispielprojekt in Spalte 3 die ComboBoxCell definiert werden soll, dann tritt der Fehler in Zeile 3 auf. Will ich die ComboBox stattdessen in Spalte 4 definieren, kommt der Fehler, sobald ich Zeile 4 betreten will.
Auch wenn mich schon interessieren würde, was genau da intern schief läuft, würde mir notfalls auch ein alternativer Weg reichen, wie ich das beschriebene Ziel (immer nur die aktuell ausgewählte Zelle als ComboBox darstellen) erreichen kann
Ich nutze VS Studio 2019 Community Edition, installierte .NET-Version 4.8. Unten ein simples Beispielprojekt zum Nachvollziehen - auf der Form befindet sich nur ein DataGridView mit dem Namen grd.
Vielen Dank schon mal vorab!
Matthias
VB.NET-Quellcode
- Public Class Form1
- Private Sub grd_CellEnter(sender As Object, e As DataGridViewCellEventArgs) Handles grd.CellEnter
- If grd.CurrentCell.ColumnIndex = 2 Then
- On Error Resume Next
- grd.Rows(grd.CurrentCell.RowIndex).Cells(grd.CurrentCell.ColumnIndex) = New DataGridViewComboBoxCell
- If Err.Number > 0 Then Debug.Print(Err.Description)
- On Error GoTo 0
- End If
- End Sub
- Private Sub DataGridView1_CellLeave(sender As Object, e As DataGridViewCellEventArgs) Handles grd.CellLeave
- On Error Resume Next
- If grd.CurrentCell.ColumnIndex = 2 Then grd.Rows(grd.CurrentCell.RowIndex).Cells(grd.CurrentCell.ColumnIndex) = New DataGridViewTextBoxCell
- On Error GoTo 0
- End Sub
- Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
- grd.Columns.Add("Col1", "Text 1")
- grd.Columns.Add("Col2", "Text 2")
- grd.Columns.Add("Col3", "Text/Combo 3")
- grd.Columns.Add(New DataGridViewComboBoxColumn With {.Name = "Col4", .HeaderText = "Combo 4"})
- grd.Rows.Add("1", "Test 1")
- grd.Rows.Add("2", "Test 2")
- grd.Rows.Add("3", "Test 3")
- grd.Rows.Add("4", "Test 4")
- grd.Rows.Add("5", "Test 5")
- grd.Rows.Add("6", "Test 6")
- grd.Rows.Add("7", "Test 7")
- grd.Rows.Add("8", "Test 8")
- End Sub
- End Class