Announcement

Collapse
No announcement yet.

Cursor in DataGridView setzen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Cursor in DataGridView setzen

    Hallo,

    ich möchte bei der Dateneingabe in meinem DataGridView Zellen übersprigen. Also, wenn ich in Zelle "A" Daten eingegeben habe, soll der Cursor nach Drücken der Tab Taste nicht in Zelle "B" sondern Zelle "C" springen. Ich habs jetzt folgendermaßen probiert:

    Private Sub dgv_CellLeave(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgv.CellLeave
    If dgv.Columns(e.ColumnIndex).Name = "B" Then
    dgv.CurrentCell = dgv.Rows(e.RowIndex).Cells("D")
    End If
    End Sub

    Allerdings tritt dann eine StackOverflowException auf. Wie macht man das normalerweise?

  • #2
    Hallo,

    die Ausnahme tritt deshalb auf weil das selbe Ereignis immer wieder aufgerufen wird (Rekursion).

    Ein Möglichkeit wäre:
    [highlight=vbnet]
    Private Sub itemsDataGridView_CellEndEdit(sender As Object, e As DataGridViewCellEventArgs)
    If e.ColumnIndex = 0 Then
    itemsDataGridView.CurrentCell.Selected = False
    itemsDataGridView.CurrentCell = itemsDataGridView(2, e.RowIndex)
    itemsDataGridView.CurrentCell.Selected = True
    itemsDataGridView.BeginEdit(True)
    End If
    End Sub
    [/highlight]

    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Nochmals

      Hallo,

      vielen Dank erstmal für deine Antwort. Ich habs genauso probiert und die Prozedur nach dem Event CellEndEdit ausgeführt.


      Code:
          
      Private Sub dgv_CellEndEdit(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs) Handles dgv.CellEndEdit
              If e.ColumnIndex = 0 Then
                  dgv.CurrentCell.Selected = False
                  dgv.CurrentCell = dgv(4, e.RowIndex)
                  dgv.CurrentCell.Selected = True
                  dgv.BeginEdit(True)
              End If
          End Sub
      es tritt zwar kein Fehler auf, aber der Sprung in die nächste Zelle funktioniert auch nicht. Hab ich da noch irgendeinen Fehler?

      Vielen Dank
      Daniel

      Comment


      • #4
        Hi Daniel,

        ich habe mal was gebastelt. Ist zwar nicht die schönste Lösung, aber sie funktioniert. (Eben wegen oben schon erwähnter Rekursion habe ich es nicht anders hinbekommen.

        Es gibt ein Form1 mit einem DataGridView(DataGridView1) mit 5 Spalten und einen Timer (Timer1) der alle 100ms tickt und per default inaktiv ist.

        Der grobe Ablauf:
        - Wenn eine Zelle verlassen wird merke ich mir welche
        - Wenn eine Zelle betreten wird prüfe ich ob es die zu überspringende ist und aus welcher Richtung der Focus kommt
        - Wenn gesprungen werden soll wird der Timer aktiviert, dieser feuert und deaktiviert sich selbst

        [highlight=vbnet]
        Public LastColumn As Integer ' Spalte die zuletzt den Focus hatte, nötig damit die Richtung bestimmt werden kann aus der die Zelle betreten wird
        Public JumpColumn As Integer ' Spalte die übersprungen werden soll
        Public NewColumn As Integer ' Die Spalte in die gesprungen werden soll
        Public NewRow As Integer ' Die Zeile in der gesprungen wird

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        System.Windows.Forms.Application.Exit()
        End Sub

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ' Die zu überspringende Spalte bestimmen über die gesprungen werden soll
        JumpColumn = 2
        ' einfach mal ein paar Rows anlegen (jede Row hat 5 Spalten über den Designer bekommen)
        DataGridView1.Rows.Add("")
        DataGridView1.Rows.Add("")
        DataGridView1.Rows.Add("")
        DataGridView1.Rows.Add("")
        DataGridView1.Rows.Add("")
        End Sub

        Private Sub DataGridView1_CellEnter(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellEnter
        ' Ist die Zelle die betreten wird, die über die gesprungen werden soll?
        If e.ColumnIndex = JumpColumn Then
        ' Die Row wird übergeben
        NewRow = e.RowIndex
        ' Ist die Zelle die verlassen wurde links von der betretenen Zelle
        If e.ColumnIndex > LastColumn Then
        ' dann eins weiter nach rechts
        NewColumn = e.ColumnIndex + 1
        Else
        ' dann eins weiter nach links
        NewColumn = e.ColumnIndex - 1
        End If
        ' Den Timer abfeuern
        Timer1.Enabled = True
        End If
        End Sub

        Private Sub DataGridView1_CellLeave(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellLeave
        ' Welche Zelle wurde gerade verlassen
        LastColumn = e.ColumnIndex
        End Sub

        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        ' den Timer sofort wieder anhalten
        Timer1.Enabled = False
        ' die neue Zelle setzen
        DataGridView1.CurrentCell = DataGridView1(NewColumn, NewRow)
        End Sub
        [/highlight]

        Wie gesagt, warscheinlich gibt es schönere Lösungen, aber mir ist nichts besseres eingefallen.

        Gruß Womble

        Comment


        • #5
          Nochmals

          Hey Womble,

          eigenartig, dass das nicht einfacher geht. Was sehr wohl geht ist, wenn man auf das KeyDown Ereignis reagiert und da die TAB Taste abfängt, also

          Code:
          Private Sub dgv_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles dgv.KeyDown
                  If e.KeyValue = 9 And dgv.CurrentCell.ColumnIndex = 0 Then
                      dgv.CurrentCell.Selected = False
                      dgv.CurrentCell = dgv(4, dgv.CurrentCell.RowIndex)
                      dgv.CurrentCell.Selected = True
                      dgv.BeginEdit(True)
                  End If
          das funktioniert aber dann nicht, wenn ich in einer Zelle eintragungen mache. Das heißt, man müsste dann noch ein Ereignis finden, um dann wiederum das KeyDown Event abzufangen. Hast du da eine Idee?

          Comment

          Working...
          X