Datagridview Frage, bearbeiten direkt im DGV

  • VB.NET

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von Triple-Axe.

    Datagridview Frage, bearbeiten direkt im DGV

    Hallo,

    ich brauche mal eure Hilfe... weis nicht wie ich ansetzen soll...

    Habe ein DataGridView, in dem werden Warengruppen (erste Spalte) aufgelistet, in der zweiten Spalte sollen direkt im DGV die Rabattgruppennamen eingetragen werden können, jedoch werden die nicht in der gleichen DB Tabelle gespeichert als die Warengruppen.

    Tabelle Warengruppen:
    Bücher A3, Bücher A4 usw.

    Tabelle Rabattgruppen:
    Rab_20_gültig ab 01.01.2011, Rab_25_gültig ab 01.01.2011 usw.


    VB.NET-Quellcode

    1. So soll DGV aussehen:
    2. WG__________RBGrup________gültig ab________
    3. BücherA4_____Rab_20________01.01.2011
    4. usw.


    Die Spalte WG soll im DGV nicht vom User verändert werden können, spalte RBGru und gültig ab jedoch schon !
    In dem Moment wo der User da direkt was eingibt, muß per code unterschieden werden ob INSERT, UPDATE oder DELETE erfolgen muß.

    Gibts dafür nen Code ?

    Wie könnte ich das umsetzen ?


    Viele Grüße
    Alex
    Wenn cih nur wüßt wie ich es besser erklären kann...


    also habe Tabelle A, darin sind alle Warengruppen gespeichert.

    BuchA3
    BuchA4
    BuchA5 -usw


    In meinen DGV soll nun in der ersten Spalte DB-Tabelle A aufgelistet werden. Wenn ich dann in Spalte 2 und drei etwas eingebe, soll er diese neue eingabe in eine andere Tabelle speichern.

    Beispiel: (Boldschrift ist meine manuelle eingabe)


    BuchA4 Rab1 01.08.2011
    BuchA5 Rab2 01.09.2011

    Nun da ich in spalte 2 und 3 etwas eingegeben habe, soll er nun in DB-Tabelle B folgendes schreiben oder wenn was geändert wurde ein update machen...

    ID KDNR BuchA4 Rab1 01.08.2011

    (KDNR ist in einem Feld wie Textbox oder als Label [zum Testen] hinterlegt.


    Konnte ich es nun besser beschreiben ?

    GRuß
    Alex
    mein read only hilft dir ja schonmal wegen spalte 1 "nurlesen"

    das sollte dir helfen bin grad mitm kopf ned bei der sache
    folgende Vorgehensweise ist einfach und 'stressfrei':

    1. SQL-Adapter erstellen
    2. SelectCommando erstellen
    3. SQLCommandBuilder erstellen (mit dem unter 1. erzeugten SQL-Adapter)
    4. Daten ins DataSet und dieses an das DGV binden
    ...
    User Daten ändern lassen
    Vor Verlassen des Tabs oder der Form Abfrage, ob Änderungen übernommen werden sollen
    wenn ja-->
    5. DataTable.EndEdit() aufrufen, damit die Änderungen in den DataRows gekennzeichnet werden
    6. Datenänderung(en) mittels MySQLAdapter.Update() in die zugrundeliegende DB schreiben
    ...

    Vorteil:
    im 2.Step werden aus dem zuvor generierten SELECT-Commando automatisch
    die weiteren INSERT, UPDATE, DELETE-Commandos erstellt; mittels Aufruf
    MySQLAdapter.Update() werden ALLE (ggf eben keine) Änderungen - die
    zunächst ja im DatenCache liegen - in die Datenbank-Tabelle übernommen,

    Ein Befehl - und der SQLCommandBuilder macht das alles für dich
    (bzw den User ;) ), weil der SQLCommandBuilder sich selbst als Listener
    in das SQL-AdapterObjekt registriert und somit weiss, welche Änderungen
    in die DB geschrieben werden müssen - und er entscheidet, welches
    Commando genommen werden muss ...
    Also: MSDN bzw Doku lesen und proggen ;) es ist garnicht so schwer...
    http://dotnet-forum.de/forums/p/570/2423.aspx#2423
    erst mal danke für die Unterstützung...

    nun habe ich das mal versuche umzusetzen und einen kleinen teilerfolg habe ich schon ...

    Erstmal mein Code:

    VB.NET-Quellcode

    1. Imports System.Data.OleDb
    2. Public Class WW_Kunden_Konditionen_1
    3. Private DBPass As String = "TESTPASS"
    4. Public KundenID As Double ' Die Kundennummer wird zum Testen mal so übergeben
    5. Private dt As New DataTable
    6. Private da As OleDbDataAdapter
    7. Private ds As New DataSet
    8. Private bs As New BindingSource
    9. Private Sub WW_Kunden_Konditionen_1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    10. Rabatte_Laden()
    11. End Sub
    12. Private Sub WW_Auftrag_Positionen_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
    13. If ds.HasChanges Then
    14. If MsgBox("Änderungen speichern?", MsgBoxStyle.Question Or MsgBoxStyle.YesNo) Then
    15. bs.EndEdit()
    16. da.Update(ds.Tables(0))
    17. End If
    18. End If
    19. End Sub
    20. Private Sub Form_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
    21. If (e.KeyCode = Keys.Escape) Then
    22. Me.Close()
    23. End If
    24. End Sub
    25. Private Sub Rabatte_Laden()
    26. Dim ConStr As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & Form1.Archiv_aktiv & "; Jet OLEDB:database Password=" & DBPass & ";"
    27. Dim Con As New OleDbConnection(ConStr)
    28. ds.Tables.Add(dt)
    29. da = New OleDbDataAdapter("SELECT * FROM WW_KundenRabatte WHERE KR_KDID = " & KundenID & "", Con)
    30. da.Fill(dt)
    31. Dim cb As New OleDbCommandBuilder(da)
    32. bs.DataSource = dt
    33. Me.DataGridView1.DataSource = bs
    34. End Sub


    soweit so gut... Er listet mir vorhandene Daten schon mal auf, ich kann auch eine neue "Zeile" also nen Datensatz hinzufügen!

    Wenn ich das Form verlasse, fragt er ob er die Daten sichern soll... JA... macht er auch!

    Wenn ich das Form erneut aufrufe, bekomme ich aber folgende Fehlermeldung:

    ds.Tables.Add(dt) >> Die DataTable gehört bereits zu diesem DataSet.


    Da scheiterts nun bei meinem Verständnis... was meint er damit, das Form wurde ja neu geöffnet... (Das Programm aber nicht neu gestertet, nur vorher Form zu und danach wieder auf)...


    Könntet Ihr mir das erlären ? Evtl. dt durch Form_Load leeren oder kaputt machen ??

    Gruß
    Alex


    EDIT:

    Habs gefunden

    Ersetze das: ds.Tables.Add(dt) durch das: ds.Tables.Add(New DataTable)


    EDIT: Denkste! Jetzt mag er das nicht mehr : DataGridView1.Rows.Clear() er sagt "Liste kann nicht gelöscht werden"... Aber lösche ich Sie nicht, werden die einträge mehgrfach angezeigt, mit jedem mal öffen des Forms werden Sie einmal mehr angezeigt.


    Hää ?


    Lieg ich so verkehrt ?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „lris08“ ()

    Ja wenn ich es kompl. beende ... funktioniert es perfekt...


    Meine Änderung wie unter EDIT beschrieben funzelt nur teilweise, ein Fehler weg kommt der neue...


    Woran liegt das ... Verstehe gerade die Welt nicht...

    EDIT:

    Und beim verlassen des Forms speichert er auch nur neue Einträge ab, geänderte werden nicht gespeichert.
    doch schon ...

    ds.Tables.Add(New DataTable) macht ja eine neue...

    aber im DataGridView werden mit jedem öffnen des Forms die glöeichen Daten nochmal angezeigt...

    Und der Update Befehl klappt auch nicht nur neu Datensätze werden geschrieben

    EDIT: ds.Tables.Remove(bs) will er nicht, Fehlermeldung: Überstandauflösung...

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

    Kleiner Fortschritt...

    Warum auch immer, habe ja nix geändert... eigentlich, ausser dass ich folgendes hinzugefügt habe:

    VB.NET-Quellcode

    1. Private Sub WW_Auftrag_Positionen_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
    2. If ds.HasChanges Then
    3. If MsgBox("Änderungen speichern?", MsgBoxStyle.Question Or MsgBoxStyle.YesNo) Then
    4. bs.EndEdit()
    5. da.Update(ds.Tables(0))
    6. End If
    7. End If
    8. Remove(dt)
    9. End Sub
    10. Private Sub Form_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
    11. If (e.KeyCode = Keys.Escape) Then
    12. Me.Close()
    13. End If
    14. End Sub
    15. Public Sub Remove(ByVal table As DataTable) ' DAS IST NEU
    16. Do While (ds.Tables.Count > 0)
    17. Dim dt As DataTable = ds.Tables(0)
    18. If (ds.Tables.CanRemove(table)) Then
    19. ds.Tables.Remove(table)
    20. End If
    21. Loop
    22. End Sub
    23. Private Sub Rabatte_Laden()
    24. Dim ConStr As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & Form1.Archiv_aktiv & "; Jet OLEDB:database Password=" & DBPass & ";"
    25. Dim Con As New OleDbConnection(ConStr)
    26. ds.Tables.Add(dt)
    27. da = New OleDbDataAdapter("SELECT * FROM WW_KundenRabatte WHERE KR_KDID = " & KundenID & "", Con)
    28. da.Fill(dt)
    29. Dim cb As New OleDbCommandBuilder(da)
    30. bs.DataSource = dt
    31. Me.DataGridView1.DataSource = bs
    32. End Sub


    Jetzt wird auf einmal geänderte Positionen wieder in die DB geschrieben, beim zweiten öffnen des Forms sind jedoch dann wieder die DB Datensätze dopüpelt vorhanden, beim 3 mal öffnen des Forms... dann schon 3 mal...
    na is doch geil *G damit weist du "devinitif" wie auch immer geschrieben *G
    das

    VB.NET-Quellcode

    1. bs.*
    das problem ist.

    und was passiert mit dem code in zeile 1 statt bs.clear

    VB.NET-Quellcode

    1. If ds.Tables.Count > 0 Then
    2. MsgBox("tabellencounter 1 " & ds.Tables.Count)
    3. Try
    4. Dim dt As DataTable = ds.Tables(0)
    5. If (ds.Tables.CanRemove(table)) Then
    6. ds.Tables.Remove(table)
    7. End If
    8. MsgBox("tabellencounter 2 " & ds.Tables.Count)
    9. Catch ex As Exception
    10. MsgBox(ex.Message)
    11. End Try
    12. Else
    13. MsgBox("tabellencounter 3 " & ds.Tables.Count)
    14. End If



    die 1 2 und 3 sind nur als mekrmal für dich damit du siehst wo er sich langhangelt :D

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Triple-Axe“ ()

    so ... nach einer Nacht (kurzen Nacht) hab ich die Lösung...

    oh mann... vielleicht bisserl komisch, aber es funktioniert...

    VB.NET-Quellcode

    1. Private Sub Rabatte_Laden()
    2. Dim ConStr As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & Form1.Archiv_aktiv & "; Jet OLEDB:database Password=" & DBPass & ";"
    3. Dim Con As New OleDbConnection(ConStr)
    4. ds.Tables.Clear()
    5. dt.Clear()
    6. DataGridView1.Columns.Clear()
    7. DataGridView1.Rows.Clear()
    8. ds.Tables.Add(dt)
    9. da = New OleDbDataAdapter("SELECT * FROM WW_KundenRabatte WHERE KR_KDID = " & KundenID & "", Con)
    10. da.Fill(dt)
    11. Dim cb As New OleDbCommandBuilder(da)
    12. bs.DataSource = dt
    13. Me.DataGridView1.DataSource = bs
    14. End Sub
    Guten Morgen!

    ne jetzt funzelt es... UPDATE, INSERT etc, geht komischer weise auch... naja, muß nicht alles verstehen...


    Jetzt werd ich mich noch an die Formaierung (Spaltenüberschriften) machen... und an die weiterverarbeitung...

    Danke für deine Hilfe
    hey lris08 nun hänge ich :D

    wollte für ein thema hier ein kleines projekt machen nur ich bin grad zu doov :whistling:

    wie bekomme ich einen neunen button ohne inhalt dazu das er mit deinem variablen+werten+namenskonventionen den aktuellen inhalt des dgv prüft und in die
    db die änderungen speichert ? zeile 5+6


    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. If myDataSet.HasChanges Then
    3. If MsgBox("Änderungen speichern?", MsgBoxStyle.Question Or MsgBoxStyle.YesNo) Then
    4. bindingSource1.EndEdit()
    5. dataAdapter.Update(myDataSet.Tables(0))
    6. MsgBox("sollte gespeichert sein")
    7. Else
    8. MsgBox("ok dann eben nicht speichern")
    9. End If
    10. Else
    11. MsgBox("hier würde ich später die aktualisierten daten aus der db neu laden")
    12. End If
    13. End Sub



    < braucht urlaub

    edit : habs hinbekommen brauch aber immernoch urlaub ;(

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Triple-Axe“ ()

    irgendwie bin ich doof

    ich bekomme es einfach nicht hin das dgv zu leeren x(
    er trägt mir die neuen daten einfach unter die alten ein
    verdoppelt also die zeilenzahl statt die alten zu löschen

    ( ja ich weis das thema ist schon alt aber warum ein neues
    machen das genau das problem bespricht das ich habe x( )


    VB.NET-Quellcode

    1. Dim myConnectionString As String = "server=localhost;uid=root;pwd=123;database=updater;"
    2. Dim conn As New MySql.Data.MySqlClient.MySqlConnection(myConnectionString)
    3. Dim cmd As MySqlCommand
    4. Dim dt As New DataTable ' DataTable enthält die via DataAdapter angepassten Daten der Datenbank)
    5. Dim ds As New DataSet
    6. Dim db As String = "updater"
    7. Dim myDataSet As New DataSet(db) ' DataSet-Instanz bilden
    8. Dim dtable As New DataTable("url") ' DataTable-Instanz bilden
    9. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    10. ds.Tables.Clear()
    11. dt.Clear()
    12. DataGridView1.Columns.Clear()
    13. DataGridView1.Rows.Clear()
    14. conn.Open()
    15. Dim da As New MySqlDataAdapter ' Macht die Anpassung (Adaptierung) zwischen Datenbank und DataTable
    16. da = New MySqlDataAdapter("SELECT * FROM `url` limit 8", conn)
    17. ' Füllt die DataTable im DataSet mit Daten aus der Datenbank.
    18. ' Der DataAdapter öffnet und schließt die Verbindung zur Datenbank selbst !!
    19. da.Fill(dt)
    20. ' Teilt dem DataGridView mit, aus welcher DataTable (=DatenQuelle) er sich die Daten zur Anzeige holen soll
    21. DataGridView1.DataSource = dt
    22. conn.Close()
    23. 'DataGridView1.Refresh()
    24. End Sub


    hoffe es findet jemand meinen fehler ich mach da schon nen tag dran rum und finde es einfach nicht :(

    mfg

    Edit by ErfinderDesRades:
    mach bitte einen eigenen Thread auf (Rubrik Datenbanken), und versuche, eine klar verständliche Frage zu formulieren - hier scheint mir nach 19 posts alles nur noch unklar.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()