Merkwürdiges Verhalten DataSet: neuen Eintrag hinzufügen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von tragl.

    Merkwürdiges Verhalten DataSet: neuen Eintrag hinzufügen

    Moin.

    Ist wahrscheinlich ein Fall für @ErfinderDesRades, aber ggf. kann ja noch jemand helfen.
    Ich möchte einen neuen Datensatz hinzufügen. Im Hintergrund sieht man auch, dass einer erstellt werden soll - nach ein paar Sekunden verschwindet aber der Eintrag im Hintergrund
    und auch nach dem Speichern habe ich keinen Datensatz da. Was kann dazu führen, dass der Vorgang nicht ausgeführt wird?

    Es scheint auch nur so zu spinnen, wenn noch kein Eintrag vorhanden ist. Habe ich bereits ein paar Datensätze (mindestens 1) da, dann kann ich auch neue hinzufügen

    Hier wird er noch angezeigt:


    nach ein paar Sekunden ohne was zu klicken oder sowas ist er weg:



    Edit: Im Debug-Modus passiert das nicht, da klappt alles wie es soll
    ?(
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    Das passiert nicht von Haus aus, da ist irgendwas in Deinem Programm, was das bewerkstelligt. Wenn der Eintrag gar nicht mehr im tDS ist, kannst Du das Löschen desselbigen durch Haltepunkte in der tDS.vb nachvollziehen. Vorher am besten ein Flag setzen, wenn ein neuer Eintrag hinzugefügt wird und den Flag auswerten, wenn wodurchauchimmer versucht wird, diesen zu löschen.
    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.

    VaporiZed schrieb:

    kannst Du das Löschen desselbigen durch Haltepunkte in der tDS.vb nachvollziehen

    jo, das würde ich ja wie folgt bewerkstelligen:

    VB.NET-Quellcode

    1. Partial Public Class dtsLogistik
    2. Partial Public Class FahrzeugDokumentDataTable
    3. Private Sub FahrzeugDokumentDataTable_FahrzeugDokumentRowDeleting(sender As Object, e As FahrzeugDokumentRowChangeEvent) Handles Me.FahrzeugDokumentRowDeleting
    4. Dim i = 0
    5. End Sub
    6. End Class
    7. End Class


    dann in Zeile 4 nen Haltepunkt setzen etc.

    Das Problem ist aber, dass da im Debug-Modus nix passiert sondern nur im Release. Jetzt könnt ich mir im Release da ne Messagebox ausspucken lassen, bringt mich aber nix weil ich
    die Aufrufliste dann nicht einsehen kann :(
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    Du könntest ne Exception werfen und nicht behandeln. Dann bekommst Du den StackTrace.

    Geht natürlich auch ohne: System.Diagnostics.StackTrace t = new System.Diagnostics.StackTrace()
    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.
    @VaporiZed:

    ich hab jetzt erstmal Plump ne Messagebox reingeknallt, die wird nicht aufgerufen, also findet kein RowDeleting statt.
    Hast du noch nen anderen Anhaltspunkt?

    VB.NET-Quellcode

    1. Partial Public Class dtsLogistik
    2. Partial Public Class FahrzeugDokumentDataTable
    3. Private Sub FahrzeugDokumentDataTable_FahrzeugDokumentRowDeleting(sender As Object, e As FahrzeugDokumentRowChangeEvent) Handles Me.FahrzeugDokumentRowDeleting
    4. msgExclamation("RW gelöscht")
    5. End Sub
    6. End Class
    7. End Class
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    Mach mal nach der Eingabe per Button ein explizites BindingSource.EndEdit.
    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.
    Ich komm nicht mal zu einer Eingabe oder Auswahl, dann ist im Hintergrund der Eintrag schon weg... passiert innerhalb von Sekunden nach dem Öffnen des
    Dialogs zur Eingabe. Den Dialog hab ich auch schon aufn Kopf gestellt, hier mal was bis zur Anzeige des Dialogs passiert:

    VB.NET-Quellcode

    1. Imports PdfSharp.Pdf
    2. Public Class dlgFahrzeugDokumentNeu
    3. Private _SelectedFile As String = ""
    4. Private _ScannedDocument As PdfDocument = Nothing
    5. Private _DestinationPath As String = ""
    6. Private _DestinationPathAndFile As String = ""
    7. Private _FileNameToStore As String = ""
    8. Private _IsScannedDocument As Boolean = False
    9. Private _storagePath As String = $"{GetUserPath("Fahrzeug")}"
    10. #Region "Form"
    11. Public Sub New()
    12. InitializeComponent()
    13. RegisterDlgHandling
    14. End Sub
    15. Private Sub frm_Load(sender As Object, e As EventArgs) Handles Me.Load
    16. ControlStyling.StyleCmbList(Me)
    17. RegisterDateInput(dtbDatum)
    18. dtbDatum.Select()
    19. End Sub
    20. Private Sub frm_Shown(sender As Object, e As EventArgs) Handles Me.Shown
    21. If App.dlgFahrzeugDokument_SelectedFahrzeug IsNot Nothing Then cmbFahrzeug.SelectedValue = App.dlgFahrzeugDokument_SelectedFahrzeug.ID
    22. bsCmbDokument.FilterX("expKategorie = ?", "Fahrzeug")
    23. End Sub


    Das Filtern der Dokument-BS hab ich schon versuchsweise in's FormLoad verschoben, jedoch ohne Änderung.
    Also beim Öffnen passiert nix, was die neue FahrzeugDokumentRow in irgendeiner Weise manipuliert.
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    Jou, das ist wohl doch ne Frage an EdR. Seine Extensions nutz ich nicht.
    Was passiert, wenn Du den FilterX nicht setzt?
    Oder noch anders:

    VB.NET-Quellcode

    1. Private Async Sub frm_Shown(sender As Object, e As EventArgs) Handles Me.Shown
    2. If App.dlgFahrzeugDokument_SelectedFahrzeug IsNot Nothing Then cmbFahrzeug.SelectedValue = App.dlgFahrzeugDokument_SelectedFahrzeug.ID
    3. Await Threading.Tasks.Task.Delay(5000)
    4. bsCmbDokument.FilterX("expKategorie = ?", "Fahrzeug")
    5. End Sub

    Wird dann der Effekt 5-Sekunden-zeitverzögert auftreten?
    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.

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

    Jo, ich warte mal ab ob er sich ggf. meldet. Ich hatte den Fall schon mal, da hat dann irgendein Bindingsource-Filter das zerschossen - das konnte man im Debug auch feststellen, aber ist hier nicht der Fall.
    Trotzdem danke schonmal ;)
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    Ich hatte meinen Post noch nacheditiert, zum Testen, ob's daran liegt.
    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.
    Dann bleiben anscheinend nur noch die Kandidaten

    VB.NET-Quellcode

    1. RegisterDlgHandling
    2. ControlStyling.StyleCmbList(Me)
    3. 'und
    4. RegisterDateInput(dtbDatum)
    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.

    VaporiZed schrieb:

    Dann bleiben anscheinend nur noch die Kandidaten

    ist alles nix Wildes und greift alles nicht in die Row ein und nutz' ich auch an vielen Stellen:

    RegisterDlgHandling:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. ''' <summary>Übernimmt das Dialog-Handling</summary>
    2. <Extension>
    3. Public Sub RegisterDlgHandling(dlg As Form)
    4. dlg.KeyPreview = True
    5. dlg.Icon = App.Icon
    6. AddHandler dlg.KeyDown, AddressOf dlg_KeyDown
    7. AddHandler dlg.Load, AddressOf dlg_Load
    8. AddHandler dlg.FormClosing, AddressOf dlg_Closing
    9. 'TextBox-Behaviour
    10. For Each ctl In dlg.AllChilds
    11. Dim tb = TryCast(ctl, TextBox)
    12. If tb.NotNull Then RegisterTextBoxSelectAll(tb)
    13. Next
    14. End Sub


    VB.NET-Quellcode

    1. Private Sub dlg_Load(sender As Object, e As EventArgs)
    2. Dim dlg = DirectCast(sender, Form)
    3. If dlg Is Nothing Then Return
    4. getSetFormSizeAndLocation(dlg, False)
    5. End Sub



    ControlStyling.StyleCmbList(Me):
    Spoiler anzeigen

    VB.NET-Quellcode

    1. ''' <summary> Überschreibt das eingestellte "Styling" aller ComboBoxen auf der Form </summary>
    2. Public Shared Sub StyleCmbList(frm As ContainerControl)
    3. Dim getChilds As Func(Of Control, IEnumerable) = Function(ctl) ctl.Controls '.Controls
    4. For Each ctl In getChilds.All(frm)
    5. Dim cmb = TryCast(ctl, ComboBox)
    6. If cmb.NotNull Then
    7. With cmb
    8. .DropDownStyle = ComboBoxStyle.DropDownList
    9. .AutoCompleteSource = AutoCompleteSource.ListItems
    10. .AutoCompleteMode = AutoCompleteMode.SuggestAppend
    11. End With
    12. End If
    13. Next
    14. End Sub


    RegisterDateInput(dtbDatum):
    Spoiler anzeigen

    VB.NET-Quellcode

    1. ''' <summary>
    2. ''' bewirkt, dass nur ein Datum in die Textboxen eingegeben werden kann - akzeptiert auch verkürzte Datum-Syntax:
    3. ''' "d", "dd", "dMM", "ddMM", und Space (darüber wird direkt das aktuelle Datum in die Textbox eingefügt)
    4. ''' Überprüft beim Verlassen der Textbox auf korrekte Eingabe.
    5. ''' </summary>
    6. ''' <param name="dateTextBoxes"></param>
    7. Public Sub RegisterDateInput(ParamArray dateTextBoxes As TextBox())
    8. For Each dtb In dateTextBoxes
    9. AddHandler dtb.Enter, AddressOf TextBox_Enter
    10. AddHandler dtb.MouseClick, AddressOf TextBox_MouseDoubleClick
    11. AddHandler dtb.KeyDown, AddressOf dtb_KeyDown
    12. AddHandler dtb.Leave, AddressOf dtb_Leave
    13. Next
    14. End Sub


    Was mich stutzig macht ist die Tatsache, dass sobald 1 Datensatz vorhanden ist es dann funktioniert. Ich möchte aber jetz nicht überall nen Dummy-Datensatz anlegen müssen, damit ich was hinzufügen kann.
    Wie gesagt, vielleicht hat @ErfinderDesRades ja noch eine Idee, sind ja seine Helpers und da nutze ich ja nur das Standardmäßige Bindingsource.EditNew(Of Dialog)
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    Mach mal folgenden Code in jedem EventHandler der BindingSource:
    If Flag Then Stop
    Und setz das Flag an jeweils einer der folgenden verschiedenen Positionen auf True
    Anfang FormLoad-EventHandler
    Ende FormLoad-EventHandler
    Anfang FormShown-EventHandler
    Ende FormShown-EventHandler
    Kommt da was raus?
    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.

    VaporiZed schrieb:

    Kommt da was raus?


    Jo, hab jetzt am Anfang ganz oben:
    Private Flag As Boolean = False

    Dann:

    VB.NET-Quellcode

    1. Private Sub frm_Load(sender As Object, e As EventArgs) Handles Me.Load
    2. Flag = True
    3. ControlStyling.StyleCmbList(Me)
    4. RegisterDateInput(dtbDatum)
    5. dtbDatum.Select()
    6. Flag = True
    7. End Sub


    VB.NET-Quellcode

    1. Private Sub frm_Shown(sender As Object, e As EventArgs) Handles Me.Shown
    2. Flag = True
    3. If App.dlgFahrzeugDokument_SelectedFahrzeug IsNot Nothing Then cmbFahrzeug.SelectedValue = App.dlgFahrzeugDokument_SelectedFahrzeug.ID
    4. bsCmbDokument.FilterX("expKategorie = ?", "Fahrzeug")
    5. Flag = True
    6. End Sub


    Und die EventHandler alle ausgegraben:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub bsFahrzeugDokumentDetail_AddingNew(sender As Object, e As AddingNewEventArgs) Handles bsFahrzeugDokumentDetail.AddingNew
    2. If Flag Then Stop
    3. End Sub
    4. Private Sub bsFahrzeugDokumentDetail_BindingComplete(sender As Object, e As BindingCompleteEventArgs) Handles bsFahrzeugDokumentDetail.BindingComplete
    5. If Flag Then Stop
    6. End Sub
    7. Private Sub bsFahrzeugDokumentDetail_CurrentChanged(sender As Object, e As EventArgs) Handles bsFahrzeugDokumentDetail.CurrentChanged
    8. If Flag Then Stop
    9. End Sub
    10. Private Sub bsFahrzeugDokumentDetail_CurrentItemChanged(sender As Object, e As EventArgs) Handles bsFahrzeugDokumentDetail.CurrentItemChanged
    11. If Flag Then Stop
    12. End Sub
    13. Private Sub bsFahrzeugDokumentDetail_DataError(sender As Object, e As BindingManagerDataErrorEventArgs) Handles bsFahrzeugDokumentDetail.DataError
    14. If Flag Then Stop
    15. End Sub
    16. Private Sub bsFahrzeugDokumentDetail_DataMemberChanged(sender As Object, e As EventArgs) Handles bsFahrzeugDokumentDetail.DataMemberChanged
    17. If Flag Then Stop
    18. End Sub
    19. Private Sub bsFahrzeugDokumentDetail_DataSourceChanged(sender As Object, e As EventArgs) Handles bsFahrzeugDokumentDetail.DataSourceChanged
    20. If Flag Then Stop
    21. End Sub
    22. Private Sub bsFahrzeugDokumentDetail_Disposed(sender As Object, e As EventArgs) Handles bsFahrzeugDokumentDetail.Disposed
    23. If Flag Then Stop
    24. End Sub
    25. Private Sub bsFahrzeugDokumentDetail_ListChanged(sender As Object, e As ListChangedEventArgs) Handles bsFahrzeugDokumentDetail.ListChanged
    26. If Flag Then Stop
    27. End Sub
    28. Private Sub bsFahrzeugDokumentDetail_PositionChanged(sender As Object, e As EventArgs) Handles bsFahrzeugDokumentDetail.PositionChanged
    29. If Flag Then Stop
    30. End Sub


    Im Debug landet er beim BindingComplete-Handler, (erst wenn ich Änderungen mache im Dialog) in der Release-Version passiert nix, außer dass die Row verschwindet.


    Edit: Hab auch grad mal die Datenbank beobachtet. Da wird tatsächlich auch nix reingeschrieben. Kurios, dass er auch beim Schließen des Dialogs keinen Fehler zeigt weil die urspr. Row die hinzugefügt werden soll ja
    bereits weg is... spätestens da sollte es doch dann knallen.


    Edit 31.05.: Das Problem hat sich in Luft aufgelöst, irgendwie ging's dann heute einwandfrei (nix geändert, einfach nochmal versucht) ?(
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

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