Eine Zeile des Datagridview explicit ansprechen

  • VB.NET

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

    Eine Zeile des Datagridview explicit ansprechen

    Hallo liebe Spezialisten!

    Ich möchte gerne in einem Datagriedview eine bestimmte Zeile ansprechen. Das schaffe ich leider nicht. Ich kann zwar eine Zeile auslesen.

    Beispiel:

    drv = datarowview
    dv = dataview
    (etwas weiter oben im Code definiert)


    drv = dv(DataGridView1.CurrentRow.Index)

    Ich starte damit von einem Datagridview und rufe ein Detailfenster auf, in dem die Daten aus dieser Zeile stehen. Anschließend setz ich ein Update-Command an die Datenbank. Dann schließe ich das Formular und lade das Datagridview erneut, indem ich das Dataset neu von der Datenbank einlese. Nun ist es leider so, dass ich nicht mehr auf den Datensatz komme, von dem ich gestartet bin.

    Wie kann ich das erreichen, wenn ich doch vorher den Index auslesen konnte und ich jetzt diesen Index wieder im Datagridview als aktuell markierte Zeile haben möchte?

    Wer kann mir bitte dabei helfen?



    LG Gerhard
    Kuck dir mal das hier an:

    VB.NET-Quellcode

    1. DataGridView1.Rows(0).Cells(0).Value.ToString()


    Damit liest du in der ersten Reihe, die erste Zelle aus.

    Du musst dann einfach nur die Zahlen ändern, aber ich denke das ist selbstverständlich ;)

    MFG Andi2572

    Geschafft!

    Hallo Andi,

    das ist ja schon mal ein guter Ansatz, nur nicht das was ich möchte. Ich möchte gerne die ganze Zeile markiert haben, dessen Index ich weiß. So nach diesem Ansatz:

    Quellcode

    1. DataGridView1.SelectedRows = 2


    Nur kommt mir dann immer die Fehlermeldung



    Die Eigenschaft "Selected Rows" ist ReadOnly



    und da komme ich einfach nicht weiter. Bei einer Combobox funktioniert das ja schon.

    Z.B.:

    Quellcode

    1. cboVerein.SelectedValue = 3


    Da wird mir der 4. Eintrag der Liste angezeigt. So etwas möchte ich auch für das Datagrid erreichen.



    @Edit

    Hallo liebe Forenhelfer!

    Bin jetzt auf die Lösung gestoßen. Mit dieser Codezeile komme ich zum gewünschten Ergebnis:

    VB.NET-Quellcode

    1. DataGridView1.CurrentCell = DataGridView1.Rows(3).Cells(0)


    Über Rows kann ich die gewünschte Zeile und über Cells die gewünschte Spalte ansprechen. :)

    Vielen Dank für die Unterstützung!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Klavier“ () aus folgendem Grund: Bin auf die Lösung gekommen!

    Fast genau

    Hallo Rotherford,

    bin froh, dass du am Sonntag online bist. Da hast du mir schon einen wertvollen Tipp gegeben. Leider ist dadurch mein Ziel noch nicht ganz erreicht. Folgendes passiert:

    1) Ich starte vom Datagrid und übernehme die ausgewählte Zeile in ein Detaildatensatzformular
    (Von daher weiß ich die Indexnummer des Datagrids)

    2) Im Detailformular setze ich ein Update an die Datenbank und schließe das Detailformular

    3) Ich fülle das Dataset mit den neuen Werten aus der Datenbank und damit auch das Datagridview, wo ich vor der Änderung gestartet bin.

    4) Nun möchte ich wieder den Datensatz so markiert haben, wie ich ihn kurz vorher für die Bearbeitung gehabt habe.

    Mit deinem Tipp bekomme ich nun die Zeile markiert, welche ich zuletzt bearbeitet habe. Jedoch ist nach wie vor der erste Eintrag in der Datagridview (Datensatzzeiger - kleines Dreieck links) und die erste Zelle dieser Zeile markiert.

    Genau genommen möchte ich jetzt, dass nicht die erste Zeile auf diese Art markiert ist, sondern die, welche ich über deinen Tipp ansprechen konnte.

    Weißt du dazu auch noch einen Rat?
    Speicher doch die Indices:
    Hier mal ein Ansatz ;)

    VB.NET-Quellcode

    1. 'Neue Liste Instanzieren.
    2. Private Indices As New List(Of Integer)
    3. Sub SaveSelections()
    4. 'Die Liste leeren.
    5. Indices.Clear()
    6. 'Alle selektierten Indices mittles LINEQ herausfinden.
    7. Dim Selected = (From i in Enumerable.Range(0,D.Rows.Count) Where D.Rows(i).Selected Select i)
    8. 'Die Indices der Liste hinzufügen
    9. Indices.AddRange(Selected)
    10. End Sub
    11. Sub LoadSelections()
    12. 'Die Selections in der DGV löschen.
    13. D.ClearSelection()
    14. 'Alle Rows wieder selektieren.
    15. Indices.ForEach(Sub(i)
    16. D.Rows(i).Selected = True
    17. End Sub)
    18. End Sub

    Liebe Grüße
    /nicht getestet

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

    Hallo Rotherford,

    ich habe zwar meinen Beitrag editiert, jedoch den falschen genommen - weiter oben. Zwischenzeitlich bin ich auf eine Lösung gekommen, mit der ich gut leben kann. Nämlich

    VB.NET-Quellcode

    1. DataGridView1.CurrentCell = DataGridView1.Rows(3).Cells(0)


    Die Zeile ist mir von der Übergabe für die Bearbeitung ja noch bekannt und damit kann ich sie mir wieder aufrufen. Deine Indexlösung hätte ich trotzdem gerne weiter verfolgt. Ich habe mir den Code kopiert und bei mir eingefügt. Jedoch weist mich der Editor sofort auf einen Fehler bezüglich Variablendeklaration hin.

    Der Name "D" wurde nicht deklariert.


    Als was muss ich den diesen deklarieren?
    Hallo Rotherford,

    ganz funktioniert es bei mir noch nicht. Ich bin mit den Fehlermeldungen von VB noch nicht so vertraut und deshalb hier noch mal die Rückfrage, wie ich das wegbekommen.


    Auf jeden Fall bekomme ich noch mit diesen Codezeilen ein Problem:

    VB.NET-Quellcode

    1. Indices.ForEach(Sub(i)
    2. D.Rows(i).Selected = True
    3. End Sub)
    4. End Sub


    Zum einen wird bei ForEach(Sub(i) eine Fehlerzeile generiert - Ausdruck erwartet

    und zum anderen bei End Sub eine Fehlerzeile generiert - "end of"-Anweisung erwartet.



    Kannst du da noch Hilfestellung geben zu deinem Tool geben, oder lassen wir es sein? Verstehen würde ich es ja schon gerne. Aber es macht auch nichts, wenn es für dich zu mühsam wird, denn ich kann mit meiner Mini-Lösung bereits leben.
    Hallo Rotherford,

    hast du noch etwas Geduld? Ich habe die zwei Subs jetzt so abgeändert, dass ich mal keine Fehlermeldung bekommen habe.

    VB.NET-Quellcode

    1. Sub SaveSelections()
    2. Indices.Clear()
    3. Dim Selected = (From i In Enumerable.Range(0, DataGridView1.Rows.Count) Where DataGridView1.Rows(i).Selected Select i)
    4. Indices.AddRange(Selected)
    5. End Sub
    6. Sub LoadSelections()
    7. DataGridView1.ClearSelection()
    8. For Each Me.i In Indices
    9. DataGridView1.Rows(i).Selected = True
    10. Next
    11. End Sub

    Beim Ausführen des Codes kommt jedoch kein Ergebnis zurück. Mir scheint, es liegt daran, dass die Sub SAVE SELECTION keinen Wert speichert. Bei der Codezeile (im Einzelschritt angehalten)

    VB.NET-Quellcode

    1. Indices.AddRange(Selected)

    kommt die Meldung

    Selected: Abfrage im Speicher / Ergebnisse: Beim Erweitern wird die Auflistung erwartet / Empty: Bei der Auflistung wurden keine Ergebnisse zurückgegeben



    Kannst du damit etwas anfangen?
    Hallo Rotherford,

    tut mir leid, ich kriegs nicht auf die Reihe. Wahrscheinlich liegt es daran, dass ich VB2008 verwende und dein Beispiel deshalb nicht so greifen kann.

    Wenn ich mir die Anzahl bei SaveSelections ausgeben lasse, kommt die 0.
    Für "FullRowSelect" gibt es bei mir keinen Eigenschaftswert beim DatagridView und wenn ich das "me" vor dem i beim LoadSelections weglasse, dann motzt VB mit einer Fehlermeldung "Der Typ für die Variable "i" wird nicht abgeleitet ...."

    Ich möchte deine Zeit nicht mehr dafür strapazieren, danke dir für deine Tipps. Das hat mir ja schon weitergeholfen. Vielleicht kannst du mir ja noch bei meinem neuen Thread Unterstützung geben?
    Da suche ich eine Möglichkeit, das DatagridView zu durchlaufen und nach einer ID zu suchen. Wenn gefunden, dann soll es mir die Zeilennummer zurückmelden, damit ich diese Zeile selektieren kann.

    Auf jeden Fall - Herzlichen Dank für deine Unterstützung! :thumbsup:
    Hilft das ? ;)

    VB.NET-Quellcode

    1. Sub SelectRowsWithID(ByVal ID As String)
    2. D.ClearSelection()
    3. 'Die 3 muss durch deinen ID-Columnindex ersetzt werden. (0-basiert)
    4. Dim Rows = (From Row As DataGridViewRow In D.Rows Where _
    5. Row.Cells(3).Value.Equals(ID) Select Row)
    6. For Each Row In Rows
    7. Row.Selected = True
    8. Next
    9. End Sub


    Liebe Grüße
    /nicht getestet
    Hallo Rotherford,

    danke, dass du da nicht locker lässt. Ich stelle mich irgendwie blöd an und komme da nicht weiter. Ich habe deinen Code insoweit angepasst:

    VB.NET-Quellcode

    1. Sub SelectRowsWithID(ByVal ID As String)
    2. DataGridView1.ClearSelection()
    3. 'Die 3 muss durch deinen ID-Columnindex ersetzt werden. (0-basiert)Dim Rows = (From Row As DataGridViewRow In DataGridView1.Rows Where _
    4. Row.Cells(0).Value.Equals(ID) Select Row)For Each Row In Rows
    5. Row.Selected = True
    6. NextEnd Sub
    Auf dem Formular, wo das Datagridview1 sich befindet, habe ich einen Button, der jetzt deinen Code aufruft und da übergebe ich den String "10" als Parameter. Bei mir ist die Spalte mit der ID die erste Spalte vom Datagridview1 und daher verwende ich

    Dim Rows = (From Row As DataGridViewRow In DataGridView1.Rows Where Row.Cells(0).Value.Equals(ID) Select Row).


    Trotzdem ist es leider so, dass ich eine Fehlermeldung bekomme - und zwar steht der Code dann nach der for each - Schleife bei NEXT.
    Fehlermeldung: NullReferenceException wurde nicht behandelt
    Die Schnellüberwachung von Row.Cells(0).Value.Equals(ID) gibt mir diese Meldung zurück:
    Referenziertes Objekt hat den Wert "Nothing"


    Was sollte ich da jetzt machen?
    In dem Datagrid befinden sich über 200 Datensätze und die Spalte ID ist für jede Zeile gefüllt.
    Ich habe jetzt mal wieder im Schrittmodus den Debugger laufen lassen. Wenn ich zu der For Each - Schleife komme, dann verweilt der Debugger ein bisschen bei der ersten Zeile der For-Each-Schleife um dann gleich zu NEXT zu gehen und mir den Fehler Fehlermeldung: NullReferenceException wurde nicht behandelt rauszuschreiben.

    Ich hätte da mal eine MsgBox eingebaut, um zu sehen, welche Werte da kommen.

    Quellcode

    1. For Each Row In Rows
    2. MsgBox(Row.Cells(0).ToString)
    3. Row.Selected = True
    4. Next

    Mir zeigt dann die Intelli-Sense bei For Each Row in Rows für
    Row (Nothing) und für
    Rows (Abfrage im Speicher)
    an.

    Sollte die For Each-Schleife nicht auf jeden Fall durchlaufen werden?
    Hallo ErfinderDesRades!

    Danke für deine Hilfestellung hier im Forum. Ich muss mich erst von EXCEL-VBA umgewöhnen. Und damit auch auf dieses Forum und den entsprechenden Werkzeugen.

    Ich werde mir diese Hilfestellungen zu Gemüte nehmen und durcharbeiten. Das dauert aber jetzt noch einige Tage, da ich hauptsächlich erst am Wochenende wirklich und ausgiebig Zeit zum Programmieren habe.

    Danke auch an Rotherford für seine Mühe! Dieser Thread kann jetzt geschlossen werden, denn Selbststudium ist jetzt angesagt!

    Klavier schrieb:

    denn Selbststudium ist jetzt angesagt!
    dieses Buch Lesen
    Einen wesentlichen Kern des Buches kann ich auch vorsagen: Es wird sich herausstellen, dass du ausnahmslos alle deine VB6/VBA-Kenntnisse vergessen kannst.
    Die sind nunmehr nur hinderlich, um in die vorgesehenen Vorgehensweisen in .Net sich einzufinden.
    Deine in post#1 skizzierte Vorgehensweise (Update an DB, DB dann neu laden) ist gleich ein Beispiel dafür.