Wie DataRow zu geklickter Zeile im DataGridView ermitteln?

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

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Wie DataRow zu geklickter Zeile im DataGridView ermitteln?

    Hallo,

    ich habe gerade folgendes Problem:

    Im DataSet myDataSet gibt es die Tabelle tblDataTable1. Je nachdem was meine Anwendung über eine Schnittstelle an Daten erhält, entstehen ein oder mehrere Datensätze. Ich übergebe die Daten von der Klasse, in der die Daten empfangen werden, als Datensätz(e) in der Tabelle dt.
    Wenn mehrere Datensätze geliefert werden, sollen diese im DataGridView myDataGridView angezeigt werden. Dazu kopiere ich die Tabelle dt in die Tabelle dtDGV und gebe sie als .DataSource des DataGridView an. Die Datensätze werden im DataGridView angezeigt, soweit funktioniert es.
    Der Anwender soll nun auf eine Zeile im DataGridView klicken können und die Anwendung muß mit dem Datensatz, der dieser Zeile zugrunde liegt, weiterarbeiten.
    Hier kommt nun mein Problem: Wie komme ich vom Klick auf die Zeile im DataGridView zum Datensatz in der Tabelle?

    Das DataGridView myDataGridView habe ich über "Datenquellen" (Tabelle im DataSet auf die Form ziehen: myDataSet.tblDataTable1) erstellt.

    Zum besseren Verständnis hier exemplarisch der Code:

    VB.NET-Quellcode

    1. Private dtDGV As myDataSet.tblDataTable1
    2. Friend Sub AbfrageErgebnis(ByVal dt As myDataSet.tblDataTable1)
    3. If dt.Rows.Count > 1 Then 'Wenn mehr als ein Datensatz existiert, Datensätze sichern und DGV anzeigen
    4. dtDGV = dt
    5. myDataGridView.DataSource = dtDGV
    6. If dtDGV.Rows.Count > 0 Then panDGV.Visible = True
    7. End If
    8. 'hier mit den Daten in 'dt' weiterarbeiten
    9. End Sub
    --------
    Lieber inkompetent als inkontinent
    vorausgesetzt zu selektierst tatsächlich nur eine Row, dann sowas hier:
    Dim row = DirectCast(dgv.SelectedRows(0).DataBoundItem, DataRowView).Row

    bzw. in typisierter Manier (hast ja ein DataSet):
    Dim row = DirectCast(DirectCast(dgv.SelectedRows(0).DataBoundItem, DataRowView).Row, tblDataTable1Row)
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    @100Volt Meinst Du vielleicht so was:

    VB.NET-Quellcode

    1. Private Sub DataGridView1_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick
    2. MessageBox.Show(String.Format("Row = {0}, Col = {1}", e.RowIndex, e.ColumnIndex))
    3. End Sub
    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!
    @100Volt Sind DataRow und e.RowIndex unterschiedlich?
    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!
    Das Ereignis .CellContentClick kann ich schon mal nicht gebrauchen, da der Anwender dann tatsächlich den Text anklicken muß. In die Zelle neben den Text geklickt, passiert nix. Wahrscheinlich erhält man die Position des Klicks aber auch bei anderen Klick-Events des DGV, das habe ich nicht geprüft.
    Aber es ist aber nunmal die Zell-Klick-Position von oben bzw. links gezählt. Die DataRow meiner Tabelle enthält mehr Daten als im DGV angezeigt werden, deshalb hilft es mir auch nichts innerhalb des DGV herumzusuchen.

    Das beste an meinem Problem ist doch aber, daß es durch die Lösung von Tragl gelöst ist :)
    --------
    Lieber inkompetent als inkontinent

    100Volt schrieb:

    da der Anwender dann tatsächlich den Text anklicken muß.
    Dann belese Dich mal zum Unterschied zwischen

    VB.NET-Quellcode

    1. Private Sub DataGridView1_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick
    2. End Sub
    und

    VB.NET-Quellcode

    1. Private Sub DataGridView1_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellClick
    2. End Sub
    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!