Fehler wenn Daten geändert werden

  • VB.NET

Es gibt 22 Antworten in diesem Thema. Der letzte Beitrag () ist von menorca.

    Fehler wenn Daten geändert werden

    erhalte diese Meldung, wenn ich einen Datensatz in ListBox auswähle und ändern will
    Fehler:
    die items-auflistung kann nicht geändert werden wenn die datasource-eigenschaft festgelegt ist

    wie kann ich dem entgegen wirken
    Hallo,

    da steht doch, dass da eine Datasource-Eigenschaft festgelegt ist, darum darfst du nicht das in der Listbox.Items-Klasse ändern, sondern nutze das Objekt, was in der ListBox.DataSource festgelegt ist.

    Beispiel:

    Ich will den ersten Listbox-Eintrag in "Test" ändern.

    VB.NET-Quellcode

    1. datasource(0) = "Test"


    Dort ist dann das Array datasource deine Festlegung in der DataSource.

    d.h. Nicht per Listbox ändern, sondern über die Festlegung der DataSource.

    MFG

    Alex-Digital :D
    so über Button ändere ich den Datensatz

    Quellcode

    1. Dim ConnString As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
    2. "Data Source=D:\BemusterungsDB\EMPB_BE.mdb"
    3. Dim myConnection As OleDbConnection = New OleDbConnection
    4. myConnection.ConnectionString = ConnString
    5. If Me.tbAntrID.Text = "" Or Me.tbAntrID.Text = 0 Then
    6. MsgBox("Bitte einen Antrieb auswählen!" & vbCrLf & _
    7. "Vorgang wird abgebrochen!", MsgBoxStyle.Exclamation, "Datensatz ändern")
    8. Exit Sub
    9. End If
    10. Try
    11. Dim sql As String = " UPDATE tblAntrieb SET tblAntrieb.AntrText = '" & tbAntrieb.Text & "'" & _
    12. " WHERE tblAntrieb.AntrID=" & Me.tbAntrID.Text & ""
    13. 'Befehl ausführen
    14. myConnection.Open()
    15. MsgBox("Änderung, wurde gespeichert", MsgBoxStyle.Information, "Vorgang Daten ändern")
    16. Dim com As New OleDbCommand
    17. Dim dbread
    18. com = New OleDbCommand(sql, myConnection)
    19. dbread = com.ExecuteReader()
    20. Me.ListBox6.Items.Clear()
    21. Call Antriebliste()
    22. Me.ListBox6.Refresh()
    23. Catch ex As Exception
    24. MsgBox("Fehler aufgetreten: " & vbCrLf & _
    25. ex.Message)
    26. End Try


    anschließend soll die ListBox mit geänderten daten neu gezeichnet (geladen werden)

    Quellcode

    1. Public Sub Antriebliste()
    2. Try
    3. Dim ConnectionString As String = ("Provider=Microsoft.Jet.OLEDB.4.0;" & _
    4. "Data Source=D:\BemusterungsDB\EMPB_BE.mdb")
    5. Dim SelectString As String = "SELECT 0 AS AntrID,'<< Antrieb vorhanden >>' AS AntrText " & _
    6. "FROM(tblAntrieb) " & _
    7. "UNION SELECT AntrID,AntrText " & _
    8. "FROM tblAntrieb;"
    9. Dim da As New OleDb.OleDbDataAdapter(SelectString, ConnectionString)
    10. da.SelectCommand.Parameters.AddWithValue("AntrID,AntrText", Me.ListBox6.Text)
    11. Dim Data As New DataSet
    12. da.Fill(Data, "tblAntrieb")
    13. ListBox6.DataSource = Data.Tables.Item("tblAntrieb")
    14. ListBox6.ValueMember = "AntrID"
    15. ListBox6.DisplayMember = "AntrText"
    16. Catch ex As Exception
    17. MessageBox.Show(ex.Message, "Beim Öffnen der Datenbank ist ein Fehler" & _
    18. "aufgetreten.")
    19. End Try
    20. End Sub


    wie meinst du es jetzt mit deiner Lösung
    Mach da mal das Try-Catch raus, da knallt es an der Stelle, wo der Fehler auftritt, nicht da, wo Du eine MessageBox hingeschrieben hast.
    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!
    OK, habe das mal auskommentiert. Kein Fehler mehr aber die ListBox wird nicht sofort geändert :pinch:

    Quellcode

    1. '*
    2. Me.ListBox1.Items.Clear()
    3. Call Kundenliste()
    4. Me.ListBox1.Refresh()
    5. '*
    6. Catch
    7. ' MsgBox("Fehler aufgetreten: " & vbCrLf & _
    8. ' ex.Message)
    9. End Try
    Dann setz mal einen Haltepunkt rein und steppe das Programm zeilenweise durch und überprüfe, ob es sich so verhält, wie Du es gedacht hast.
    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!
    Sorry, konnte deinen Tip erst jetzt prüfen

    Quellcode

    1. Dim sql As String = " UPDATE tblKunde SET tblKunde.KuWerk = '" & tbwerknr.Text & "'," & _
    2. " tblKunde.KuText = '" & tbKunde.Text & "'" & _
    3. " WHERE tblKunde.KuID=" & Me.tbkuid.Text & ""
    4. 'Befehl ausführen
    5. myConnection.Open()
    6. MsgBox("Änderung, wurde gespeichert", MsgBoxStyle.Information, "Vorgang Daten ändern")
    7. Dim com As New OleDbCommand
    8. Dim dbread
    9. com = New OleDbCommand(sql, myConnection)
    10. dbread = com.ExecuteReader()
    11. '*
    12. Call Kundenliste()
    13. Me.ListBox1.Refresh()
    14. '*
    15. Catch
    16. ' ''MsgBox("Fehler aufgetreten: " & vbCrLf & _
    17. ' '' ex.Message)
    18. End Try


    diese Stelle musste raus

    Quellcode

    1. Me.ListBox1.Items.Clear()


    doch der geänderte Wert (String) wird nicht sofort in der ListBox aktualisiert
    beim neuladen der Form ist der Wert dann der geänderte. Der Anwender möchte aber doch sofort seine Änderung erkennen
    nach dem er die Meldung erhält Wert geändert
    Du verwendest eien DataSource, also musst Du die Änderung Deiner Daten in dieser DataSource vornehmen, nicht im ListView.
    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!
    Hi

    ErfinderDesRades
    ,

    mit deinem Beitrag #4 komme ich nicht zurecht.

    nach entfernen der clear Methode, bekomme ich den Datensatz geändert, doch die ListBox wird nicht gleich mit geänderten Eintrag
    aktualisiert, erst wenn ich die Form neu lade. Das soll ja gleich nach "Update" geschehen das der Anwender die Änderung sieht
    Sorry, sorry

    ich kann immer noch nicht folgen, wie ich es machen soll.

    ich habe einen Button "Update", wenn ein 'Kunde' ausgewählt wird und geändert werden muss dann schreibe ich es so in die Datenbank

    Quellcode

    1. '//
    2. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    3. Dim ConnString As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
    4. "Data Source=D:\BemusterungsDB\EMPB_BE.mdb"
    5. Dim myConnection As OleDbConnection = New OleDbConnection
    6. myConnection.ConnectionString = ConnString
    7. If Me.tbkuid.Text = "" Or Me.tbkuid.Text = 0 Then
    8. MsgBox("Bitte einen Kunden auswählen!" & vbCrLf & _
    9. "Vorgang wird abgebrochen!", MsgBoxStyle.Exclamation, "Datensatz ändern")
    10. Exit Sub
    11. End If
    12. Try
    13. Dim sql As String = " UPDATE tblKunde SET tblKunde.KuWerk = '" & tbwerknr.Text & "'," & _
    14. " tblKunde.KuText = '" & tbKunde.Text & "'" & _
    15. " WHERE tblKunde.KuID=" & Me.tbkuid.Text & ""
    16. 'Befehl ausführen
    17. myConnection.Open()
    18. MsgBox("Änderung, wurde gespeichert", MsgBoxStyle.Information, "Vorgang Daten ändern")
    19. Dim com As New OleDbCommand
    20. Dim dbread
    21. com = New OleDbCommand(sql, myConnection)
    22. dbread = com.ExecuteReader()
    23. '*
    24. Call Kundenliste()
    25. Me.ListBox1.Refresh()
    26. '*
    27. Catch
    28. ' ''MsgBox("Fehler aufgetreten: " & vbCrLf & _
    29. ' '' ex.Message)
    30. End Try
    31. End Sub


    und über neu einlesen

    Quellcode

    1. Call Kundenliste()


    muss doch nun eigentlich, die ListBox aktuell sein, also wie soll ich die Änderung nun abfahren das versteh ich noch nicht
    auch deine "Fette" Anmerkung bringt mir kein Verständnis was du eigentlich meinst
    Habe ich doch probiert,

    Quellcode

    1. MsgBox("Änderung, wurde gespeichert", MsgBoxStyle.Information, "Vorgang Daten ändern")
    2. Dim com As New OleDbCommand
    3. Dim dbread
    4. com = New OleDbCommand(sql, myConnection)
    5. dbread = com.ExecuteReader()
    6. '*
    7. Data.Tables.Item("tblAntrieb")
    8. Me.ListBox1.Refresh()
    9. '*
    10. Catch
    11. ' ''MsgBox("Fehler aufgetreten: " & vbCrLf & _
    12. ' '' ex.Message)
    13. End Try


    jetzt kommt tables ist kein Member von Data, das war doch auch meine Frage wie und wohin sind wohl mehr als 4 Worte
    ups - ich meinte natürlich post#3, also deinen eigenen Code.

    Und du fragst schon wieder, wie man einen Listbox-Eintrag ändern soll. Ja, und dass mans garnet ändern soll, das kannst du halt nicht fassen.

    Man muß die DataRow ändern, an der das ListboxItem gebunden ist.
    Und diese DataRow ist in der DataTable, an die die Listbox gebunden ist.