In einem DataGridView einen Click-Event auslösen

  • VB.NET

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

    In einem DataGridView einen Click-Event auslösen

    Schon lange beschäftigt mich ein Problem: Ich habe oben ein DataGridView, in welchem ich verschiedene Datensätze abbilde. Mit einem Mausklick werden einzelne gewählt und die Daten werden in Textfelder eingefüllt, wo sie differenziert bearbeitet werden können. Nun fülle ich beim Start der Applikation die Tabelle und möchte gerne, dass der Datensatz auf der ersten Zeile direkt in die Textfelder eingefüllt wird. Doch ich kriege das einfach nicht hin. Folgende Versuche habe ich schon unternommen:

    Quellcode

    1. with datagridview1
    2. .Focus()
    3. .Rows(0).Selected = True
    4. SendKeys.Send("{ENTER}")
    5. end with


    Das funktioniert manchmal. Aber eben nicht wirklich zuverlässig. Wie kann ich einen wirklichen Mouse-Click-Event auf die erste ROW eines DataGridView setzen? - Wichtig: Ich weiss, wie ich verschiedene MouseEvents auswerte, das ist nicht das Problem. Was ich brauche ist ein richtiger "Klick". Geht das überhaupt?
    Du hast doch bestimmt in einem EventHandler Deine verschieb-mir-die-Daten-in-die-Textfelder-Funktionalität. Warum packst Du diese Funktionalität nicht einfach in eine Funktion und rufst diese im KlickEventHandler auf, so wie bisher (

    icewather schrieb:

    Mit einem Mausklick werden einzelne gewählt und die Daten werden in Textfelder eingefüllt
    ) und führst außerdem jene Funktion nach dem Import aus? Warum krampfhaft einen Mausklick simulieren, wenn Dein Ziel nicht zwangsläufig an die Maus gebunden sein muss?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Standardmäßig würde man Databinding verwenden.
    Das verhält sich aber anders (imo: besser) als das was du beschreibst.
    Bei deim Ansatz: Was soll in den Textboxen angezeigt sein, wenn der User per Cursor-Taste zB auf die 3.Zeile navigiert?
    a) garnichts
    b) Daten der 1.Zeile
    c) Daten der 3.Zeile

    Falls du c) wählst, wirst du mit deim Ansatz ("richtiger" Klick (was immer das sein mag)) nicht hinkommen, denn CursorTasten-Drücke sind ja keine Klicks.
    @icewather
    Wenn ich deine Anfrage so durchlese, bedienst du ein ungebundenes DGV und ladest deine Daten (von wo auch immer) direkt in dieses hinein...
    Gehe einen Anderen Weg(wie EDR schon schrieb) und versuche dein DGV und deine Controls an deine Daten zu binden - benutze dazu auch eine Bindingsource!
    Du wirst sehen, dass sich dann deine Frage erübrigt hat und du hast damit auch die Daten von der GUI ordentlich getrennt und operierst nicht mehr umständlich in den Controls herum!
    Herzlichen Dank für eure Antworten. - Wenn ich meine Fragestellung nochmals lese, dann sehe ich einmal mehr, wie schwierig es ist, ein komplexes Problem mit ein paar Sätzen auszudrücken. In euren Antworten spüre ich auch ziemlich viel von meiner Inkompetenz. Als ich im letzten Jahr eine uralte VB6 Applikation aus zwingenden Gründen neu schreiben musste, habe ich die vielen neuen Features von VS2017 gar nicht wirklich genutzt.

    Danke für eure Hilfe. Leider ist der Umfang des Programms nun schon so gross, dass ich das Programmier-Konzept mangels meiner Zeitressourcen nicht nochmals neu überdenken und überarbeiten kann. Hier zeige ich euch kurz, was ich mache - verstehe aber auch sehr gut, wenn ihr sagt: Das ist so schräg, dass ich mich gar nicht eindenken will :(

    Zuerst Binde ich das DGV (heisst hier grRes) an die Datenbank:

    Quellcode

    1. If dbConn.State = ConnectionState.Closed Then dbConn.Open()
    2. daRes = New OleDbDataAdapter("SELECT " & sqlgrResSelect & " FROM " & sqlgrResFrom & " WHERE " & sqlgrResWhere & " ORDER BY " & sqlgrResOrder, dbConn)
    3. Dim cbRes As New OleDbCommandBuilder(daRes)
    4. dtRes = New DataTable("Ressourcen")
    5. daRes.Fill(dtRes)
    6. dbConn.Close()
    7. Dim bsRes As New BindingSource
    8. dvRes = New DataView(dtRes)
    9. bsRes.DataSource = dvRes
    10. foStart.tabMain.TabPages.Item(0).Text = "Ressourcen (" & bsRes.Count.ToString() & ")"
    11. With grRes
    12. .AutoGenerateColumns = True
    13. .DataSource = bsRes
    14. .Columns(0).Visible = False
    15. .Columns("GrPersAnbinden").Visible = False
    16. 'weitere Bearbeitung von Cols...
    17. end with
    18. [color=#FF0000]Hier wollte ich nun einen Klick Event setzen, damit beim erstmaligen Anbinden des DGV auch schon die Textfelder aus der ersten ROW gefüllt werden.[/color]


    Nun klicke ich mit der Maus oder der Tastatur auf das DGV und löse damit ein Sub aus, mit welchem ich die Textfelder an das DGV einfülle. Die Textfelder sind nicht an das DGV angebunden, sondern nur inhaltlich eingefüllt:

    Quellcode

    1. drvRes = dvRes(grRes.CurrentRow.Index)
    2. drvRes.BeginEdit()
    3. vResGridId = grRes.SelectedRows.Item(0).Cells("ResId").Value
    4. coResArt.Text = drvRes("Art").ToString
    5. teResTitel.Text = drvRes("Titel").ToString
    6. teResNotizen.Text = drvRes("Notizen").ToString
    7. coResAutor.Text = drvRes("Autor").ToString
    8. coResOrt.Text = drvRes("Ort").ToString
    9. teResDatum.Text = drvRes("Datum").ToString
    10. teResWert.Text = drvRes("Wertung").ToString
    11. teResAblage.Text = drvRes("Ablage").ToString
    12. teResMail.Text = drvRes("Mail").ToString
    13. teResAblageNr.Text = drvRes("Nr").ToString
    14. coResBuchTitel.Text = drvRes("BuchTitel").ToString
    15. teResBuchNr.Text = drvRes("BuchNr").ToString
    16. teResBuchSeite.Text = drvRes("BuchSeite").ToString


    Nun bearbeite ich die Felder und jedesmal, wenn ich mit LostFocus ein Feld verlasse, wird der Inhalt des Feldes in das DGV und in die Datenbank zurückgeschrieben. Auf diese Weise kann ich die Felder ganz individuell überprüfen und weitere Funktionen durchführen, bevor sie gespeichert werden. Am Beispiel des ComboBox-Textfelds "Art" zeige ich das:

    Quellcode

    1. Private Sub coResArt_GotFocus(sender As Object, e As EventArgs) Handles
    2. coResArt.GotFocusvGotFocus = coResArt.Text
    3. coResArt.SelectAll()
    4. End Sub
    5. Private Sub coResArt_LostFocus(sender As Object, e As EventArgs) Handles coResArt.LostFocus
    6. If vNeuRB = False Then
    7. If vGotFocus <> coResArt.Text Then
    8. drvRes.BeginEdit()
    9. drvRes("Art") = coResArt.Text
    10. drvRes("WriteDate") = Now()
    11. drvRes.EndEdit()
    12. Call ResChangeFields()
    13. End If
    14. End If
    15. End Sub
    16. Public Sub ResChangeFields()
    17. Dim dt1Res As DataTable = dtRes.GetChanges()
    18. If dt1Res IsNot Nothing Then
    19. Try
    20. If dbConn.State = ConnectionState.Closed Then dbConn.Open()
    21. daRes.Update(dt1Res)
    22. dtRes.AcceptChanges()
    23. dbConn.Close()
    24. Catch ex As System.Exception
    25. MessageBox.Show(ex.Message & zs & "Unter Umständen wurde die Ressource oder Teile daraus trotzdem gespeichert. Falls das häufiger vorkommt, können Sie einen ScreenShot an churchsoftware.ch senden", "Speichern fehlgeschlagen!", MessageBoxButtons.OK, MessageBoxIcon.Information)
    26. dtRes.RejectChanges()
    27. dbConn.Close()
    28. End Try
    29. End If
    30. End Sub




    Ich weiss nicht, ob das einigermassen verständlich ist. Vermutlich würde ich es heute ganz anders programmieren - so wie ihr es oben beschreibt. Leider krieg ich den Quellcode hier im Forum auch nicht auf die Reihe :(
    jo - der typische Mega-Umstand, der bei rauskommt, wenn man mit Datenbank anfängt, ohne Grundlagen von Datenmodellierung und Databinding gelernt zu haben.

    Meinst du wirklich, du kannst Zeit sparen, indem du die notwendigen Vorraussetzungen jetzt immer noch nicht lernst?
    Meist ist eher das Gegenteil der Fall: Zeitverlust.

    Wiedemauchsei. Eine kleine Erleichterung kann es dir verschaffen, wenn du DataAdapter und BindingSources nicht per Code erstellst, sondern aus der Toolbox aufs Form ziehst.
    BindingSource hat ein CurrentChanged-Event, darin kannst du drauf reagieren, wenn der User einen Datensatz anwählt (sei es mit Maus oder mit Tastatur).

    achso - zum Code einstellen: Verwende halt die richtigen Buttons - für Vb.Net-Code zB den Vb.Net - Button.

    Nach einigen weiteren fast durchprogrammierten Nächten kann ich dem EDR nur zustimmen: 100% richtig. Es wäre clever gewesen, sich in einem Datenbank-Versuchsprojekt zuerst einmal auszutoben und alle Fehler dort zu machen, bevor man sich wie aus dem Nichts heraus (10 Jahre nicht mehr programmieren) an ein grösser Projekt herangeht. Unterdessen habe ich die obige Fragestellung einigermassen gelöst - jedoch mit verschiedenen unschönen Kniffs, die keinesfalls empfehlenswert sind. Danke für eure Tipps und Hinweise. Ich frage gerne wieder, auch wenn ich weiss, dass ich nicht nochmals von vorne beginnen kann... leider...
    ich nochmal dein Code geguckt - Du solltest glaub ühaupt erstmal mit Strict On anfangen, und den Microsoft.VisualBasic - GeneralImport entfernen.

    VS wird leider mit völlig irrwitzigen Voreinstellungen ausgeliefert, die es Einsteigern ganz unnötig irrwitzig schwer machen, auch nur die grundlegendsten Basics einer OOP-Sprache zu kapieren.
    gugge Visual Studio - Empfohlene Einstellungen