Announcement

Collapse
No announcement yet.

DataGridView und Update

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

  • DataGridView und Update

    Hallo!

    Ich sitze nun schon den halben Tag und versuche, bei meinem Projekt das DataGridView zum Update zu bewegen - bisher ohne Erfolg.

    Ich arbeite an einer Datenbanklösung zur Speicherung von hardware, Software und Lizenzen.

    Ich verwende VB.NET 2010 und dahinter liegt eine MySql-Datenbank.

    Insert funktioniert bei mir folgendermaßen:

    Code:
    Dim selectedHW As Object
            Dim keytypeID As String
    
            selectedHW = cmbHWType.SelectedItem
    
            'Unterabfrage zum Suchen der ID, die der entsprechenden Auswahl in der Kombobox
            'zuzuordnen ist
            keytypeID = "(Select TYPEID from HWTYPES where HWTYPE = '" & selectedHW & "')"
    
            'Unterabfrage
            insertquery = "INSERT INTO HARDWARE (HWID, hwname, DOMAINNAME, hwstandort, ipadress, TYPEID) VALUES ('NULL', ' " & txtHWName.Text & "', '" & txtDomain.Text & " ', '" & txtStandort.Text & "', ' " & txtIP.Text & "'," & keytypeID & ");"
    
            mycommand.Connection = myconnection
            mycommand.CommandText = insertquery
            mycommand.ExecuteNonQuery()
    
            'Eingabefelder zurücksetzen
            For Each C As Control In Me.Controls
                If TypeOf C Is TextBox Then
                    C.Text = ""
                End If
            Next C
    
            showdb()
    und Anzeigen folgendermaßen:

    Code:
    showdatatable.Clear()
    
            showquery = "SELECT hw.hwname, hw.domainname, hw.hwstandort, hw.ipadress, ty.hwtype from hardware hw, hwtypes ty WHERE hw.typeid = ty.TYPEID"
    
            'MySqlCommand-Objekt
            mycommand.Connection = myconnection
            mycommand.CommandText = showquery
    
            'Command an das MySqlData-Objekt übergeben
            showadapter.SelectCommand = mycommand
    
            'DataAdapter füllt die DataTable
            showadapter.Fill(showdatatable)
            showadapter.Update(showdatatable)
    
            'Daten an das DataGridView binden
            dgvHardware.DataSource = showdatatable
            dgvHardware.Update()
            dgvHardware.Refresh()
    
            'Zellen automatisch anpassen
            dgvHardware.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells
    Update hab ich hier sowas:

    Code:
    bindingsource.DataSource = showdatatable
            dgvHardware.DataSource = bindingsource
    
            Dim updatecommand As New MySqlCommand("UPDATE hardware SET hwname = @hwname WHERE hwid = @hwid", myconnection)
            updatecommand.Parameters.Add("@hwid", MySqlDbType.VarChar, 100, "hwname")
    
            showadapter.UpdateCommand = updatecommand
            showadapter.Update(showdatatable)
    Nun möchte ich, wenn ich im DataGridView etwas ändere, das auch an die Datenbank weiterleiten. Ich habe bisher mehrere Möglichkeiten durchprobiert.

    Der Tip mit dem CommandBuilder ist gut, nützt mir aber nichts, da ich Joins verwende, um die Daten anzuzeigen.

    Kann mir jemand helfen? Im Endeffekt kann es doch nicht so schwer sein! Aber nirgendwo findet man halt DEN Anhaltspunkt, der einen weiterbringt.

    PS: Auf die MSDN habe ich schon geschaut, aber bei dem ganzen Wust an Informationen bin ich hinterher nicth viel schlauer als vorher

    MfG Moni

  • #2
    Woher soll er denn deiner meinung nach wissen was er wo ändern soll, wenn Du die ersten Daten über einen JOIN abfrägst? Wenn Du mal genau überlegst kann das eigentlich gar nicht funktionieren.
    Mir fällt so auf die schnelle eigentlich nur ein auf OnCellChanged oder so zu gehen und nach jeder Zelländerung ein Update auszuführen. Das ist allerdings eine sehr sehr sehr sehr sehr sehr hässliche Methode.
    Ansonsten könnte man noch auf Tabellenbasis arbeiten, also ohne dass Du irgendwelche JOINs in der Queries hast. Macht aber natürlich das anzeigen nicht einfacher
    Aber JOINs und editieren war sowieso noch nie eine gute Idee. Vielleicht da nochmal drüber nachdenken.

    Comment


    • #3
      Nun möchte ich, wenn ich im DataGridView etwas ändere, das auch an die Datenbank weiterleiten. Ich habe bisher mehrere Möglichkeiten durchprobiert.
      Dann würde ich das Update aus dem RowChanged Event deiner showdatatable
      Datatable ausführen (also durch einen deiner gezeigten Code Fragmente).


      Du hast gesagt das du vieles probiert hast aber nicht ob es bei diesen Versuchen ein Problem gab und wenn welches. Was ist den jetzt dein konkretes Problem?

      Comment


      • #4
        Verstehe ich das richtig, dass es besser wäre, das DataGridView nicht über eine Join-Abfrage zu füllen, sondern ein DataSet mit DataTables zu füllen und zwischen diesen dann eine Relation herzustellen?

        Ich habe dazu schon eine Anleitung gefunden. Allerdings steht dann im MSDN was von Child- und Parent-Datagridview, also wahrscheinlich sowas wie im Access ein Formular mit Unterformular, aber sowas will ich ja gar nicht.

        Meine Frage: Wenn man die Relation hergestellt hat, lassen sich die Daten dann ganz normal als EINE Tabelle im DataGridView darstellen? (Sprich: die letzte Spalte, die über Fremdschlüssel eine Beziehung zu einer anderen Tabelle herstellt, wird direkt auch als letzte Spalte angezeigt bei dieser Methode?)

        Bin mir nicht ganz sicher ob dein Vorschlag mit dem RowChanged Event zum gewünschten Erfolg führt, aber ich probier es gern aus :-)

        Comment


        • #5
          Ich habe folgenden Code

          Code:
           bindingsource.DataSource = showdatatable
                  dgvHardware.DataSource = bindingsource
          
                  Dim updatecommand As New MySqlCommand("UPDATE hardware SET hwname = @hwname WHERE hwid = @hwid", myconnection)
                  updatecommand.Parameters.Add("@hwid", MySqlDbType.VarChar, 100, "hwname")
          
                  showadapter.UpdateCommand = updatecommand
                  showadapter.Update(showdatatable)
          soeben in der CellValueChanged probiert.

          Er bringt mir allerdings die Fehlermeldung, dass der Parameter @hwname definiert werden muss. Das ist ja aber die entsprechende Spalte der momentan ausgewählten Zeile. Wie also definieren??

          Comment


          • #6
            Du wirst mit JOINs egal ob die jetzt in einem DataSet oder einer normal SQL Abfrage vorkommen NIE ein einfaches UPDATE hinbekommen. Dafür ist das Thema einfach zu komplex um eine simple Lösung hinzubekommen.
            Wie oben schon beschrieben kannst Du auch auf das RowChanged Event gehen und von dort aus die SQL Kommandos für die Datenbank generieren.

            Comment


            • #7
              Dass es kompliziert werden würde, hätte ich so gar nicht gedacht, aber am eigenen Leib zu spüren bekommen. Sonst würde ich nicht seit gestern morgen daran rumbasteln ^^ Ist es denn prinzipiell UNMÖGLICH oder geht es nur um 24 Ecken mit dem Update?

              Es kann doch aber nicht sein, dass sowas - einfach - nicht möglich ist. Im Access geht's doch auch dachte ich. Abgesehen davon bin ich ja denk ich mal nicht die erste, die sowas umzusetzen versucht. Das muss ja irgendjemand schonmal gemacht haben :-)

              Okay, ich weiß ungefähr wie ich es zu machen habe. Die SQL-Befehle kann ich ja.

              Nun liegt mein Problem aber darin, wie ich die Zellen anspreche. Gibt's da irgendwas, wo man die aktuell angewählte Zelle auswählen kann, dort eine Change-Methode reinschreibt sodass der neue Wert den alten überschreibt?

              Comment

              Working...
              X