none
Datagridview und readonlyspalte skippen... RRS feed

  • 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
    Dienstag, 19. Juli 2011 16:06

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:

      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
    
    
    Der Umstand mit dem Setzen ergibt sich daraus, dass man ansonsten zweimal in SetCurrentCellAddressCore landen würde,
    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.html

    Wenn 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

     

     

    Mittwoch, 20. Juli 2011 10:51

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:

      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
    
    
    Der Umstand mit dem Setzen ergibt sich daraus, dass man ansonsten zweimal in SetCurrentCellAddressCore landen würde,
    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.html

    Wenn 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

     

     

    Mittwoch, 20. Juli 2011 10:51
  • Hallo Elmar.

    baaaa wahnsinn...danke dir ! hat mir auf den richtigen Weg geholfen...

    bye,

    Mario

    Mittwoch, 20. Juli 2011 13:42