Problem mit BindingSource.current - Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Problem mit BindingSource.current - Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt

    Hi Leute

    komme bei einem Problem mit der Bindingsource nicht weiter.

    Ich habe ein typisiertes DataSet mit einer Datatable "Preisliste". Über eine Combobx wähle ich ein Produkt aus. Der Text der ComboBox dient als Filter für die Bindingsource.

    Nach Filterung berechne ich einen Preis inkl. Fracht und Abzüge. Das funktioniert alles einwandfrei. Wenn ich die Anwendung schließe, bekomme ich eine Fehlermeldung.
    "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt." Der Wert der als "Null" angezeigt wird, fließt in meine Berechnung korrekt ein.

    Die Fehlermeldung kommt in der Zeile mit dem DirectCast.

    Mein Code:

    VB.NET-Quellcode

    1. Tbprodukt.Text = ElementComboBox.Text
    2. element = ElementComboBox.Text
    3. PreislisteBindingSource.Filter = "Element LIKE '" & element & "'"
    4. Dim zeile = DirectCast(DirectCast(PreislisteBindingSource.Current, DataRowView).Row, Dts.PreislisteRow)
    5. Dim menge As Decimal
    6. Decimal.TryParse(Tbmenge.Text, menge)
    7. Dim spaltenpreis As Decimal
    8. If menge > 0 Then
    9. If menge <= 500 Then
    10. spaltenpreis = zeile.bis_500
    11. Tblistenpreis.Text = Format(spaltenpreis, "C2")
    12. Tbmenge.Text = Format(menge, "N2")
    13. Bis_500TextBox.ForeColor = Color.Red
    14. Else
    15. Bis_500TextBox.ForeColor = Color.Black
    16. End If
    17. End If


    Jemand ne Idee woran das liegen könnte?
    Das hab ich bereits probiert.

    VB.NET-Quellcode

    1. Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
    2. PreislisteBindingSource.RemoveFilter()
    3. End Sub


    In der ComboboxSelectedIndexChanged rufe ich die Methode Preiskalkulieren auf.

    VB.NET-Quellcode

    1. Private Sub Preiskalkulieren()
    2. Tbprodukt.Text = ElementComboBox.Text
    3. element = ElementComboBox.Text
    4. PreislisteBindingSource.Filter = "Element LIKE '" & element & "'"
    5. Dim zeile = DirectCast(DirectCast(PreislisteBindingSource.Current, DataRowView).Row, Dts.PreislisteRow)
    6. Dim menge As Decimal
    7. Decimal.TryParse(Tbmenge.Text, menge)
    8. Dim spaltenpreis As Decimal
    9. If menge > 0 Then
    10. If menge <= 500 Then
    11. spaltenpreis = zeile.bis_500
    12. Tblistenpreis.Text = Format(spaltenpreis, "C2")
    13. Tbmenge.Text = Format(menge, "N2")
    14. Bis_500TextBox.ForeColor = Color.Red
    15. Else
    16. Bis_500TextBox.ForeColor = Color.Black
    17. End If
    18. End If
    19. vkpreis = spaltenpreis + fracht - limit + zulagen
    20. If CheckBox1.Checked = True Then 'Spectrum
    21. vkpreis += CDec(1.5)
    22. End If
    23. If CheckBox2.Checked = True Then '+0,10mm
    24. vkpreis += CDec(1)
    25. End If
    26. If CheckBox3.Checked = True Then '+0,20mm
    27. vkpreis += CDec(2)
    28. End If
    29. If CheckBox4.Checked = True Then 'Sonderfarbton 200-400
    30. vkpreis += CDec(3.5)
    31. End If
    32. If CheckBox5.Checked = True Then 'Sonderfarbton 400-600
    33. vkpreis += CDec(2)
    34. End If
    35. If CheckBox6.Checked = True Then 'Sonderfarbton > 600
    36. vkpreis += CDec(1.25)
    37. End If
    38. If CheckBox7.Checked = True Then 'FM Approved
    39. vkpreis += CDec(1.5)
    40. End If
    41. Tbverkaufspreis.Text = Format(vkpreis, "C2")
    42. End Sub
    Die Stelle sieht schon gut aus, blos der Inhalt verhindert ja nicht, dass dein Code durchlaufen wird.

    Eher so in die richtung:

    VB.NET-Quellcode

    1. Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
    2. RemoveHandler Combobox.SelectedIndexChanged, addressof Combobox_SelectedIndexChanged
    3. End Sub

    silverbob76GE schrieb:

    das der Filter nach SelectedIndexChanged nicht weiterläuft, wenn nicht erneut betätigt.
    BindingSource.Filter ist - wenn du man nachguckst - ein String.
    Der kann nicht laufen.
    Man kann einen String auch nicht betätigen.

    Ein Programm läuft.
    Eine Combobox kann man betätigen.
    Im weitesten Sinne ist die Anwendung zu schliessen auch das Betätigen einer Combobox.
    Weil die verliert ihre Daten, und damit ändert sich ihr SelectedIndex.

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

    ja klar, ich meinte das der Filter in der bindingsource noch gesetzt ist, und ein neuer Filter wird ja auch nicht aufegrufen. Daher sollte es doch nicht zu einer Nullverweisausnahme kommen. Der Wert für die Spalte ist ja bei aktuellem Filter nicht null.
    Ist für mich nicht logisch nachvollziehbar.

    Jetzt machts klick. Vielen Dank für deine Hilfe, das hat mich wieder ein Stück weitergebracht.
    RemoveHandler? Für solch eine Fall hab ich ne BS-Extension namens HasNoCurrent bzw. Function für meine typed BindingSource:

    VB.NET-Quellcode

    1. If MyBindingSource.HasNoCurrent Then Return

    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.