Datagrid View - Cursor Steuerung

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Datagrid View - Cursor Steuerung

    Hi,

    ich muss ein bissl weiter ausholen, um mein Problem (hoffentlich) verständlich zu machen.

    Ich habe eine Datagridview, die mit FullRowSelect = True definiert ist. Da kann man doch auf (mindestens) drei verschiedene Weisen Zeilen auswählen.

    1. Durch Anklicken der Zeile mit der linken Maustaste.

    2. Durch Drückne der "Arrow Up" bzw. "Arrow Down" Taste (dadurch wird die aktuell ausgewählte Zeile nach oben bzw. nach unten verschoben).

    3. Programmatisch durch den Befehl dgv.rows(ix).Selected = True

    Soweit so gut.

    Ich wähle mit dem Maus Cursor in meiner Datagridview etwa Zeile 15 aus

    Dann setze ich dgv.rows(38).Selected = True. Jetzt ist die Zeile 38 ausgewählt. Das funktioniert also so wie gewünscht.

    Und nun drücke ich die "Arrow Down" Taste. Was passiert ?

    Naiv wie ich nun mal bin, hätte ich angenommen, dass die Zeile 39 ausgewählt wird.

    Tatsächlich "springt der Cursor" aber zurück und es wird die Zeile 16 ausgewählt. Das will ich nicht !

    Wie kann ich erreichen, dass die Zeile 39 ausgewählt wird !

    Ich hoffe, ich habe mein Problem verständlich machen können!

    Ich habe übrigens in meinem Programm nach dem Setzen der auswählten Zeile noch den Befehl dgv.Focus() hinzu gefügt. Allerdings auch dies bleibt ohne Erfolg.

    Irgend eine Eigenschaft der dgv übersehe ich hier vermutlich. Nur welche ist das ?

    Könnt ihr mir (nachsichtig) auf die Sprünge helfen ?

    LG
    Peter
    Hallo @Peter329

    Ist so ziemlich schwer nachzuvollziehen. Interessnt wäre auch zu wissen, wie die DGV "gefüttert" wird. Gibt es ein Dataset, oder dergleichen?
    Oder wird das anders gelöst?

    Eventuell hilft dir schon mal so was. Das Problem kann aber natürlich auch ganz anders liegen. Ich arbeite noch mit FW4.0.Es ist also auch möglich das es schon ganz ander Möglichkeiten git.

    VB.NET-Quellcode

    1. Private Sub dgw1_RowEnter(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs) Handles dgw1.RowEnter
    2. 'Schauen ob es die Zeile ist für Neueinträge
    3. If dgw1.Rows(e.RowIndex).IsNewRow Then
    4. dgw1.SelectionMode = DataGridViewSelectionMode.CellSelect
    5. dgw1.Rows(e.RowIndex).Selected = False
    6. If Not dgw1.Rows(e.RowIndex).Cells(e.ColumnIndex).Selected Then
    7. dgw1.Rows(e.RowIndex).Cells(e.ColumnIndex).Selected = True
    8. End If
    9. Else
    10. 'So erlaube ich VB.Net eine Zeile auswählen zu können
    11. dgw1.SelectionMode = DataGridViewSelectionMode.FullRowSelect
    12. 'Prüfen oder Festlegen der entsprechenden Zeile
    13. If Not dgw1.Rows(e.RowIndex).Selected Then
    14. 'Ganze Zeile markieren
    15. dgw1.Rows(e.RowIndex).Selected = True
    16. End If
    17. End If
    18. End Sub


    Freundliche Grüsse

    exc-jdbi
    @Peter329 Neben der .Selected gibt es noch eine .CurrentRow-Property, diese ist es, die Du suchst.
    msdn.microsoft.com/de-de/libra…currentrow(v=vs.110).aspx
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Deswegen der Link.

    Hinweise:
    To change the current row, you must set the P:System.Windows.Forms.DataGridView.CurrentCell property to a cell in the desired row.
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    @Peter329

    Also so einen ähnlichen Effekt hatte ich mal, als ich den Rowindex für ein Beispiel programmübergeordnet deklariert habe.
    Ich hab mich damals durch tausende von Zeilen Code durchgewühlt, ohne Sicht das Problem je lösen zu können.

    Jo, und dann plötzlich sieht man es wieder :D .

    Freundliche Grüsse

    exc-jdbi
    wow ... das ist natürlich eine wichtige Information, die man kennen sollte:

    VB.NET-Quellcode

    1. dgvCompareFiles.Rows(k).Selected = True
    2. dgvCompareFiles.SelectedCells(0).Selected = True 'Set selected CELL ... just to keep arrow UP / DOWN happy


    So habe ich das jetzt kodiert ... und diese zusätzliche Zeile wirkt WUNDER ! Es funktioniert !

    Oh, brave new world ! I find wonders in it ever other day ! :)

    Also ... das werde ich mir merken! Herzlichen Dank für eure unschätzbaren Ratschläge ! Da hätte ich sonst lange suchen können.

    Also, Daumen hoch und Problem gelöst !

    LG
    Peter

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Peter329“ ()

    Ne, die beiden Befehle sind schon erforderlich. Mit dem ersten Befehl wird auf die k-te Zeile (Zählung bei 0 beginnend) positioniert ... und mit dem zweiten Befehl selektiere ich dann in dieser Zeile die erste Zelle. Und erst die Auswahl einer Zelle macht dann die positionierte Zeile zur "Current Row". Und die Arrow Up / Down Tasten nehmen auf die current Row Bezug.

    Das sollte man besser wissen ! Sonst kann man bei der Fehlersuche verzweifeln ! :)