Announcement

Collapse
No announcement yet.

DataGridView Update funktioniert nicht

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

  • DataGridView Update funktioniert nicht

    Hallo,

    ich habe ein DataGridView in dem Datenbankinhalte abhängig von der Auswahl in einem Listview angezeigt werden. Das funktioniert soweit ganz gut. Immer wenn man ein anderes Element im Listview auswählt wird werden die aktuell angezeigten Daten mittels Update gespeichrt. Anschließend die wird der Inhalt des DataGridView neu aufgebaut.
    Leider werden die Änderungen nicht in der Datenbank gespeichert. Oder sagen wir so manchmal nicht. Mir ist noch keine Regelmässigkeit dahinter aufgefallen. Vielleicht kann mir jemand von euch weiterhelfen. Hier der Code:
    Code:
    Me.TANK_DAT_NEUTableAdapter.Update(StatistikDataSet.TANK_DAT_NEU)
    Me.TANK_DAT_NEUTableAdapter.Adapter.SelectCommand.CommandText = _
                    "SELECT" & _
                    "tlfdno,lieferant,t_date,landiso,stationname,produktbez,quanti" & _
                    "y,tidnr,tpol_kennz,satmsglfd FROM statistik.dbo.tank_dat_neu" & _
                    "where satmsglfd is null and tidnr='" & _
                    lvFzgAuswahl.SelectedItems(0).Text & "' order by t_date desc"
    Dim objcb As SqlCommandBuilder = New SqlCommandBuilder( _
    Me.TANK_DAT_NEUTableAdapter.Adapter)
    objcb.RefreshSchema()
    Me.TANK_DAT_NEUTableAdapter.Fill(Me.StatistikDataSet.TANK_DAT_NEU)
    Me.dgTR.DataSource = Me.StatistikDataSet.TANK_DAT_NEU

  • #2
    Hallo und willkommen,

    bitte beachte künftig, dass die Daten im DataSet und dessen DataTables stehen und sie auch dorthin geladen und von dort gespeichert werden. Das siehst Du schließlich daran, dass Fill und Update nichts mit dem DataGridView zu tun haben! (Deshalb passt Deine Überschrift überhaupt nicht.)

    Grundsatz unter ADO.NET ist die Trennung der Daten: (a) Datenbank auf der Festplatte, (b) Daten im Arbeitsspeicher (meistens DataSet), (c) Anzeige und Eingabe im GUI. Verbindung zwischen a und b findet durch DbConnection mit DbDataAdapter oder DbDataReader statt; Verbindung zwischen b und c durch DataBinding und DataSource. Eine direkte Verbindung zwischen a und c gibt es nicht!!!

    Zu Deinem Problem: Da Du das DataGridView direkt an die DataTable gebunden hast, werden automatisch Änderungen durch den Anwender in der DataTable gespeichert. Also landen sie durch Update auch in der Datenbank. Es gibt nur ein kleines Problem, und das dürfte bei Dir der Fall sein (darauf deutet das "manchmal ohne Regelmäßigkeit" hin): Die Änderungen einer Zeile werden erst beim Wechsel der Zeile abgeschlossen. Wenn der Speichern-Button gedrückt wird, ohne dass die letzte bearbeitete Zeile erledigt ist, fehlt diese Zeile bei den Änderungen.

    Lösung: Vor dem Update-Befehl ist noch DataGridView.EndEdit() auszuführen.

    Übrigens ist das Neu-Laden der Daten nach dem Update meistens überflüssig.

    Gruß Jürgen

    Comment


    • #3
      ich habe das mit dem EndEdit ausprobiert. Es war nicht die Lösung hat mich aber drauf gebracht. So habe ich gemerkt dass immer die Spalte nicht geändert wurde die noch selektiert war (SelectionMode=FullRowSelect).
      Jetzt gehts aber weiter: Ich habe dann vor dem updaten ein dg.ClearSelection () ausgeführt was mir aber nicht weitergeholfen hat. Die Änderungen werde nur übernommen, wenn ich vor dem Updaten auf ne andere Zeile klicke. Kann mir hier jemand helfen?

      Comment


      • #4
        In welchem ListView Event wird der Update durchgeführt?

        Hintergrund der Frage ist das ein Control sein lokalen Daten insbesondere auch bei einem Focuswechsel in die am Control hängende Datenmenge überträgt. Eigentlich sollte das Wechseln des Eintrags im Listview zum Focuswechsel vom DatagridView zum Listview führen womit die die Daten eigentlich in die DataTable übernommen sein sollten. Außer du hängst in einem Event das vor dem erhalten des Focus feuert(wenn es den so ein Event überhaupt gibt).

        Comment


        • #5
          Eigentlich sollte mein obiger Hinweis auf EndEdit ausreichen. Wichtig ist, dass zuerst die Bearbeitung im DataGridView beendet wird und erst danach die Adapter.Update-Methode aufgerufen wird. Jürgen
          Zuletzt editiert von Jürgen Thomas; 09.01.2009, 13:28.

          Comment


          • #6
            Eigentlich sollte mein obiger Hinweis auf EndEdit ausreichen.
            Eigentlich trifts genau. EndEdit funktioniert (aus leidiger Erfahrung) nur zu 99%(wobei das 1% dummerweise unbekannt bleibt weil in der MSDN nicht beschrieben ist und nicht klar ob es by Design oder ein Bug ist).
            Wenn man alles standardmäßig macht gehts aber wenn man irgendwelche (ok oft eher esoterische) Modi/Einstellungen der verschiedenen Winforms Controls benutzt geht EndEdit dann doch nicht.

            Letztlich ist nach meiner Einschätzung nur ein erzwungener Focuswechsel vor dem Update wirklich sicher.

            Hab gerade mal gegoogelt und da scheint EndEdit nicht zu funktionieren wenn man den Datagridview im VirtualMode betreibt. Es gibt aber sicher noch andere Ausfälle von EndEdit im Datagridview.

            Comment


            • #7
              Ich habe jetzt vor dem .Update den Focus auf ein anderes Control gelegt. Aber auch damit läuft es nicht, immer der letztmarkierte Datensatz wird nicht aktuallisiert.

              Comment


              • #8
                Hmh. Hast du mal überprüft ob die nicht aktualisierte Row zu diesem Zeitpunkt vielleicht einfach noch nicht gültig ist? Weil du vielleicht erst nachträglich in einem unglücklichen Event erst beim RowLeave die ID des Datensatzes einfügst oder irgendetwas in der Art ?

                Falls du noch EndEdit drin hast der liefert auch einen Returnwert der anzeigt ob das Beenden des Editieren überhaupt möglich war. Den solltest du vielleicht mal überprüfen.

                Und das Grid zeigt ja einen Indikator an. Wenn du solch einen Fehlerfall hast ist dann, nach dem Update, das Grid weiterhin im Editmode? Also wird weiterhin das Bleichstift(oder was auch immer das Symbol für editieren ist) Symbol als Indikator angezeigt? Das wäre ein Hinweis darauf das die Row einfach noch nicht gültig ist.

                Comment


                • #9
                  Falls du noch EndEdit drin hast der liefert auch einen Returnwert der anzeigt ob das Beenden des Editieren überhaupt möglich war. Den solltest du vielleicht mal überprüfen.
                  Der liefert true

                  Und das Grid zeigt ja einen Indikator an. Wenn du solch einen Fehlerfall hast ist dann, nach dem Update, das Grid weiterhin im Editmode? Also wird weiterhin das Bleichstift(oder was auch immer das Symbol für editieren ist) Symbol als Indikator angezeigt? Das wäre ein Hinweis darauf das die Row einfach noch nicht gültig ist.
                  Der verhält sich ganz normal, sprich, ich tipp was in ne Zelle dann ist der Stift da, wechsle die Zelle und dann ist er weg.

                  Comment


                  • #10
                    Also ich habe die Lösung. Richtig erklären kann ich es mir noch nicht, aber egal:

                    Wenn ich den SelectionMode vom Grid auf RowHeaderSelect stelle, dann funktioniert der Update. Bei mir ist eigentlich FullRowSelect eingestellt gewesen. Jetzt mach ich es so dass ich den Modus vor dem Updaten kurz umstelle.

                    Vielen Dank für Eure Hilfe und natürlich auch für die grundsätzlichen Hinweise zur Konzeption von ADO.NET.... ist alles schon wieder ein bischen lang her.

                    Comment

                    Working...
                    X