Benutzer mit den meisten Antworten
Datagridview und readonlyspalte skippen...

Frage
-
Hallo,
und eine weitere Frage zum Datagridview :
Spalte 1 wird mit einer Validierung abgefangen
ob die Eingaben soweit gültig sind oder nicht.Spalte 2 ist nur eine Info spalte und darf nicht
beschrieben werden ; steht auch auf ReadOnly.Nach dem drücken der TAB Taste in der Spalte 1
und erfolgreicher Validierung möchte ich das die Eingabe
in Spalte3 steht und nicht auf Spalte2.Gibts dazu eine handfeste Idee ? Meine Versuche
scheitern leider soweit alle..Danke,
Mario
- Typ geändert Thorsten Dörfler Dienstag, 19. Juli 2011 17:48 Mehr Frage als Diskussionsaufruf
Antworten
-
Hallo Mario,
eine Variante:
Public Class DataGridViewHelper ''' <summary>Überspringt schreibgeschützte Zellen.</summary> Public Shared Sub DataGridViewSkipReadonlyCells(ByVal gridView As DataGridView, ByVal e As DataGridViewCellEventArgs) ' Nichts zu tun If Not gridView.CurrentCell.ReadOnly Then Return End If Dim newRow = e.RowIndex Dim newColumn = e.ColumnIndex + 1 Do ' Nächste Zeile If newColumn >= gridView.ColumnCount Then newRow += 1 If newRow >= gridView.RowCount Then Return End If newColumn = 0 End If ' Überspringen nicht sichtbare und schreibgeschützte Zellen If Not gridView.Rows(newRow).Cells(newColumn).Visible _ OrElse gridView.Rows(newRow).Cells(newColumn).ReadOnly Then newColumn += 1 Else ' Verzögert das Setzen und vermeidet so eine InvalidOperationException in SetCurrentCellAddressCore gridView.BeginInvoke(DataGridViewCellEnter, gridView, newRow, newColumn) Exit Do End If Loop End Sub ' Führt das Setzen der neue Zelle durch Private Shared DataGridViewCellEnter As Action(Of DataGridView, Integer, Integer) = Sub(gridView, rowIndex, columnIndex) gridView.CurrentCell = gridView.Rows(rowIndex).Cells(columnIndex) 'gridView.BeginEdit(True) End Sub End Class
und Einsatz zum Bleistift:
Der Umstand mit dem Setzen ergibt sich daraus, dass man ansonsten zweimal in SetCurrentCellAddressCore landen würde,Private Sub DataGridView_CellEnter(sender As System.Object, e As System.Windows.Forms.DataGridViewCellEventArgs) _ Handles CustomersDataGridView.CellEnter, OrdersDataGridView.CellEnter DataGridViewHelper.DataGridViewSkipReadonlyCells(DirectCast(sender, DataGridView), e) End Sub
was eine InvalidOperationException auslöst. Eine ähnliche Lösung (in C#) findet sich auch in
http://codemumbler.blogspot.com/2011/02/one-aspect-of-datagridviews-that-you.htmlWenn man ein eigenes DataGridView abgeleitet hat (Du glaube ich ;-), so kann man das auch im OnCellEnter erledigen
und auf die Hilfsklasse verzichten.Wobei ein Schönheitsfehler ist, dass Shift+Tab (oder Cursor links) vor einer ReadOnly-Zelle verharren
(und wie üblich erst zum Schluß entdeckt). Um das zu unterscheiden, müsste man ProcessTabKey o. ä. überschreiben.Gruß Elmar
- Als Antwort markiert Thorsten Dörfler Mittwoch, 20. Juli 2011 20:59
Alle Antworten
-
Hallo Mario,
eine Variante:
Public Class DataGridViewHelper ''' <summary>Überspringt schreibgeschützte Zellen.</summary> Public Shared Sub DataGridViewSkipReadonlyCells(ByVal gridView As DataGridView, ByVal e As DataGridViewCellEventArgs) ' Nichts zu tun If Not gridView.CurrentCell.ReadOnly Then Return End If Dim newRow = e.RowIndex Dim newColumn = e.ColumnIndex + 1 Do ' Nächste Zeile If newColumn >= gridView.ColumnCount Then newRow += 1 If newRow >= gridView.RowCount Then Return End If newColumn = 0 End If ' Überspringen nicht sichtbare und schreibgeschützte Zellen If Not gridView.Rows(newRow).Cells(newColumn).Visible _ OrElse gridView.Rows(newRow).Cells(newColumn).ReadOnly Then newColumn += 1 Else ' Verzögert das Setzen und vermeidet so eine InvalidOperationException in SetCurrentCellAddressCore gridView.BeginInvoke(DataGridViewCellEnter, gridView, newRow, newColumn) Exit Do End If Loop End Sub ' Führt das Setzen der neue Zelle durch Private Shared DataGridViewCellEnter As Action(Of DataGridView, Integer, Integer) = Sub(gridView, rowIndex, columnIndex) gridView.CurrentCell = gridView.Rows(rowIndex).Cells(columnIndex) 'gridView.BeginEdit(True) End Sub End Class
und Einsatz zum Bleistift:
Der Umstand mit dem Setzen ergibt sich daraus, dass man ansonsten zweimal in SetCurrentCellAddressCore landen würde,Private Sub DataGridView_CellEnter(sender As System.Object, e As System.Windows.Forms.DataGridViewCellEventArgs) _ Handles CustomersDataGridView.CellEnter, OrdersDataGridView.CellEnter DataGridViewHelper.DataGridViewSkipReadonlyCells(DirectCast(sender, DataGridView), e) End Sub
was eine InvalidOperationException auslöst. Eine ähnliche Lösung (in C#) findet sich auch in
http://codemumbler.blogspot.com/2011/02/one-aspect-of-datagridviews-that-you.htmlWenn man ein eigenes DataGridView abgeleitet hat (Du glaube ich ;-), so kann man das auch im OnCellEnter erledigen
und auf die Hilfsklasse verzichten.Wobei ein Schönheitsfehler ist, dass Shift+Tab (oder Cursor links) vor einer ReadOnly-Zelle verharren
(und wie üblich erst zum Schluß entdeckt). Um das zu unterscheiden, müsste man ProcessTabKey o. ä. überschreiben.Gruß Elmar
- Als Antwort markiert Thorsten Dörfler Mittwoch, 20. Juli 2011 20:59