Daten werden visuell nicht aktualisiert

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

Es gibt 25 Antworten in diesem Thema. Der letzte Beitrag () ist von kurzda.

    Daten werden visuell nicht aktualisiert

    Hallo,

    bin gerade dabei mein Programm auf EF6 mit SQlite umzustellen (ich weiß nicht sexy und schön, aber so habe ich es in der Schule gelernt) und stoße derzeit auf ein Problem beim aktualisieren von Datensätzen.

    So binde ich das DGV an die Daten

    VB.NET-Quellcode

    1. Dim AnzeigeVormerkungen = From VM In Me.Kontext.Vormerkungen
    2. Select VM.ArtikelNr, VM.ArtikelObjekt.OE, VM.ArtikelObjekt.EAN, VM.Aufgabe, Vollständig = If(VM.ArtikelObjekt.VFG >= Variablen.VerfuegbarkeitMenge, "Ja", "Nein"),
    3. VM.Prio, VM.ArtikelObjekt.BildDatum Order By Prio Descending, Aufgabe, ArtikelNr
    4. BSVormerkungen.DataSource = AnzeigeVormerkungen.ToList
    5. DGV.DataSource = BSVormerkungen


    Jetzt gibt es hier die Spalte Prio. In der Regel sind alle Einträge mit Prio 2. Manchmal möchte man einen Eintrag höher/niedriger priorisieren. Das mache ich mit folgendem Code

    VB.NET-Quellcode

    1. Dim GewaehlteVormerkung As Vormerkung
    2. Decimal.TryParse(Zeile.Cells("ArtikelNr").Value.ToString, GewaehlteArtikelNr)
    3. GewaehlteVormerkung = Me.Kontext.Vormerkungen.Where(Function(x As Vormerkung) x.ArtikelNr = GewaehlteArtikelNr).Single
    4. GewaehlteVormerkung.Prio += 1
    5. Me.Kontext.SaveChanges()
    6. Me.dgvAufgaben.Refresh()


    Danach erwarte ich, dass die Zeile im DataGridView sich augenblicklich aktualisiert, ich muss aber jedes Mal erst die Daten neu laden.

    Geht das nicht oder mache ich was falsch?

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

    Hallo

    Ich habe dir schon mal den Link zur Doku von Ef gepostet.
    Hier findest du Infos.

    Hierfür gibt es das .ToBindingList().

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

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

    Also ich weiß das ich ein Amateurprogrammierer mit maximal 7,5% Kenntnis über Programmierung habe, aber ernsthaft wer tut sich so etwas an.
    Ich finde durch EF und dem ganzen Kram ist das nicht leichter geworden. Mein händsärmliches Programm was absolut nach keiner Regel, nach keinem Schema, mit Fehlern behaftet und nicht performant läuft, läuft aber seit 3 Jahren ununterbrochen und bescherrt meinem Unternehmen eine geordnete Aufgabenverwaltung und -steuerung mit allen Annehmlichkeiten.

    Jetzt wo man etwas mehr in der Schule gelernt hat, versucht man sauberer zu programmieren und eben die Regeln zu berücksichtigen, da bleibt es aber alle 20cm irgendwo hängen und man macht Beinbrüche sondergleichen, damit das Programm dann angeblich besser läuft, wobei es überhaupt nicht läuft.

    Ich dachte die ganze Zeit ich docktere wie bisher an der Datenbank im Ausgabeverzeichnis herum (so wie es bisher üblich war), aber nein ich hab mich gerade eine besseren belehren lassen. Durch die Einbindung und Verzahnung sind dynamische Verweise auf eine Datenquelle gar nicht mehr so leicht möglich. Ich ändere Daten die ganze Zeit in meiner Entwicklungsdatenbank und zerschieße meine Daten. Man gut das ich Veeam habe.

    Egal, dann läuft das alte Programm eben unsauber, fehlerhaft, nicht performant. Ich hisse die weiße Flagge.
    @kurzda

    Was soll ich dir nur darauf Antworten.
    Du hast dich (das sehe ich auch an den Abfragen) mit Entity Framework NICHT beschäftigt und es NICHT gelernt.
    EF ist wie der Name sagt ein Framework, dementsprechend groß und auch mächtig ist es. Es füllt ganze Bücher, ich selbst habe bereits mehrere gelesen und kann dir nur raten dies auch zu tun. (Holger Schwichtenberg ist hier erstmal ne gute anlaufstelle)

    Du kannst mit EF sehr gute und performante Applikationen schreiben und das auch sehr schnell.
    Aber wenn man nicht mal die Doku lesen möchte wird das eben nix.

    Ich hatte damals meine erste Applikation welche seit 3 Jahren bei uns im Betrieb auf ca. 50 Rechnern einwandfrei und performant läuft mit EF 6 verwirklicht.
    Und ich hatte keinerlei probleme. Nur habe ich mir eben wirkich eine Woche Zeit genommen und die Doku und die Beispiele gelesen und versucht zu verstehen. Erst dann gings los.

    Das kann ich dir nur auf den Weg geben, wenn du probleme hast kannste ja hier Fragen, aber wenn etwas nicht klappt dann eben auch den Code immer Posten.

    Ansonsten gib hald auf, solange du damit schlafen kannst, ich könnte es nicht. Wenn ich etwas lernen will dann mach ich das auch. Auch wenn Steine im Weg liegen.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    @Nofear23m

    Sorry für meine Frustration. Fuchst mich ungemein, wenn ich etwas nicht verstehe.

    Na ja war noch nie einer, der erst die Bücher liest und dann los legt. Lieber durch Fehler lernen, prägt sich bei mir besser ein, bin aber eben mehr Techniker als Programmierer und wenn eben nur Office-Dinge.
    Interessant finde ich auch die Aussage, dass mein Code semi sexy ist, da ich ihn so in der Schule gelernt habe und nach Landesrecht NRW damit letztes Jahr Betriebswirt für Wirtschaftsinformatik geworden bin.

    Das Microsoft-Buch gab es scheinbar nicht mehr, hab ein anderes von ihm gekauft. Schade das alles in C# ist, muss ich wohl Telerik bequemen um zu übersetzen.

    Was heißt damit schlafen können. Wenn ich es nicht in meinen Kopf bekomme vernünftig zu programmieren, weil es zu komplex für mich ist als Office-Programmierer, dann ist es kaufmännisch betrachtet irgendwann nicht mehr zu vertreten, wenn ich rumdümpel und nur mit biegen und brechen ein Programm zum laufen bekomme. Kein Unternehmen kann es sich erlauben mit so etwas zu spielen. Irgendwann muss man die Notbremse ziehen und doch ein Profi damit beauftragen.

    Meine Empfindung ist nur, dass EF6 mega kompliziert ist auch wenns großartig ist, was man damit alles machen.

    Im übrigen habe ich den Code nochmal angepasst mit .Local.ToBindingList genauso wie es seinerzeit in der Schule auch funktioniert hat und mein Code funktioniert nicht. Er aktualisiert das DGV nicht. Der einzige erkennbare Unterschied ist, dass nicht die Entität selber die DataSource von der BindingSource ist, sondern eine LINQ-Abfrage, weil ich nur bestimmte Infos brauche und auch abhängige Entitätsattribute.

    Ergänzung 09:03
    Ich hab jetzt mal versuchsweise

    VB.NET-Quellcode

    1. BSVormerkungen.DataSource = Me.Kontext.Vormerkungen.Local.ToBindingList()

    und siehe da, alle Änderungen werden sofort auch angezeigt, genauso wie ich es wollte. Also liegt es an der LINQ-Abfrage, dass es nicht funktioniert

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

    Es geht auch mit der Abfrage nur musst du eine BindingSource daraus machen.
    Wie gesagt, es dauett viel länger wenn man Stundenlang rumprobiert als wenn man sich einliest, also lass ich die Ausrede nicht gelten. Ich glaube dir auch das ihr es in der Schule so gelernt habt, schlecht isses trotzdem. Du hast sicher LazyLoading aktiv und machst kein Select in deine Abfrage, somit hast du schon mal hier nen Flaschenhals. Vieles was man lernt, lernt man nur oberflächlich. Es kiegt an einem selbst dies das zu vertiefen.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hey Sascha,

    Ich weiß gar nicht was ich eingestellt habe, Eager oder Lazy?

    Also ich bearbeite gerade das Buch durch "Schwichtenberg - Moderne Datenzugriffslösungen" und irgendwie klappt das nicht ganz so, vielleicht habe ich durch Konvertierung von C# in VB.Net irgendwo ein Fehler gemacht und sehe ihn nicht.

    Das ist mein Select

    VB.NET-Quellcode

    1. Friend Const VMSQL As String = "Select VM.ArtikelNr, Artikel.OE, Artikel.EAN, VM.Aufgabe, CASE WHEN Artikel.VFG >= 1 THEN 'Ja' ELSE 'Nein' END AS Vollständig, " &
    2. "VM.Prio, Artikel.BildDatum " &
    3. "FROM tabVormerkungen AS VM LEFT JOIN tabArtikelstamm AS Artikel ON VM.ArtikelNr = Artikel.ARTANR " &
    4. "Order By VM.Prio DESC, VM.Aufgabe, VM.ArtikelNr"


    Ich habe den SQL auf der Datenbank ausgeführt und läuft 1a.

    So greife ich darauf zu:

    VB.NET-Quellcode

    1. Dim VM As IEnumerable(Of Vormerkung) = Me.Kontext.Database.SqlQuery(Of Vormerkung)(VMSQL)


    Und so weise ich der BindingSource die DatenSource zu:

    VB.NET-Quellcode

    1. BSVormerkungen.DataSource = VM.ToList


    Erhalte aber als Fehlermeldung

    Quellcode

    1. *********************************************************************************
    2. Datum: 15.08.2018 11:28:07
    3. Klasse: FrmAufgaben
    4. Prozedur: BGWDaten_DoWork
    5. Benutzer: SBWP/wp
    6. *********************************************************************************
    7. Der Index war außerhalb des Arraybereichs.
    8. bei System.Data.Entity.Core.Query.InternalTrees.ColumnMapFactory.CreateEntityTypeElementColumnMap(DbDataReader storeDataReader, EdmType edmType, EntitySet entitySet, ColumnMap[] propertyColumnMaps, Dictionary`2 renameList)
    9. bei System.Data.Entity.Core.Query.InternalTrees.ColumnMapFactory.CreateColumnMapFromReaderAndType(DbDataReader storeDataReader, EdmType edmType, EntitySet entitySet, Dictionary`2 renameList)
    10. bei System.Data.Entity.Core.Objects.ObjectContext.InternalTranslate[TElement](DbDataReader reader, String entitySetName, MergeOption mergeOption, Boolean streaming, EntitySet& entitySet, TypeUsage& edmType)
    11. bei System.Data.Entity.Core.Objects.ObjectContext.ExecuteStoreQueryInternal[TElement](String commandText, String entitySetName, ExecutionOptions executionOptions, Object[] parameters)
    12. bei System.Data.Entity.Core.Objects.ObjectContext.<>c__DisplayClass63`1.<ExecuteStoreQueryReliably>b__62()
    13. bei System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func`1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess)
    14. bei System.Data.Entity.Core.Objects.ObjectContext.<>c__DisplayClass63`1.<ExecuteStoreQueryReliably>b__61()
    15. bei System.Data.Entity.Infrastructure.DefaultExecutionStrategy.Execute[TResult](Func`1 operation)
    16. bei System.Data.Entity.Core.Objects.ObjectContext.ExecuteStoreQueryReliably[TElement](String commandText, String entitySetName, ExecutionOptions executionOptions, Object[] parameters)
    17. bei System.Data.Entity.Core.Objects.ObjectContext.ExecuteStoreQuery[TElement](String commandText, ExecutionOptions executionOptions, Object[] parameters)
    18. bei System.Data.Entity.Internal.InternalContext.<>c__DisplayClass13`1.<ExecuteSqlQuery>b__12()
    19. bei System.Lazy`1.CreateValue()
    20. bei System.Lazy`1.LazyInitValue()
    21. bei System.Lazy`1.get_Value()
    22. bei System.Data.Entity.Internal.LazyEnumerator`1.MoveNext()
    23. bei System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
    24. bei System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
    25. bei SB_FotoCommander.FrmAufgaben.BGWDaten_DoWork(Object sender, DoWorkEventArgs e) in C:\VBE\SB-FotoCommander\SB-FotoCommander\FrmAufgaben.vb:Zeile 787.
    26. *********************************************************************************

    Hallo

    Wo soll ich Anfangen? Warum jetzt mit SQL hantieren wenn du LINQ Unterstützung hast, du nimmst dir jegliche kompilerprüfung.
    Mit BSVormerkungen.DataSource = VM.ToList hast ja wieder den selben murks gemacht oder.

    Nebenbei, weil ich glaub du bist bin dem Buch direkt in ein Kapitel gesprungen ohne die vorigen gelesen zu haben: LazyLoading ist eine Sache welche dir extrem viel Probleme einhandeln kann wenn man nicht damit umzugehen weis, und in EF 6 per Default aktiv (leider).

    Vorschlag, du stellst hier mal das Projekt oder den Code des Contexts und des Models Online. und dann schauen wir uns das ganze an.
    Klar, ich könnte jetzt ein Beispiel erstellen, aber das kannst du vieleicht nicht umsetzen weil du ein ganz anderes Model und einen anderen Context hast.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Sorry, vieleicht habe ich mich falsch ausgedrück.

    Im Grunde macht ein LINQ wie db.Vormerkungen.Where(Function(v) v.Id = 123).FirstOrDefault oder (From db.Vormerkungen As VM Where VM.Id = 123).FirstOrDefault ja nichts anderes als eine Abfrage auszuführen.
    EF generiert ein SQL und führt dieses aus. Anschliessend überführt es das Resultset in deine Entitäten und füllt die POCO Klassen.

    Deshalb rede ich dann von Abfragen. Sorry falsch ich mich da nicht klar ausgedrückt habe, du muss natürlich kein SQL schreiben, dann könntest du ja sowieso fast schon auf EF verzichten.

    PS: Warte dann mal auf den Upload von, dann kann ich das Problem nachvollziehen/nachstellen, denn auswendig kann ich es dir nicht sagen, ich habe noch nie mit EF unter WinForms gearbeitet und auch noch nie direkt darauf gebunden, da mir das zu "unsicher" ist. Ich will immer gerne die Kontrolle haben wie wann was gespeichert wird weshalb ich nie direkt binde.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Okay, ne dann habe ich das missverstanden.

    Wenn Du dieses P.S. so schreibst, dann interpretiere ich das mein Ansatz, so wie ich ihn auch in der Schule gelernt habe, kompletter Müll ist und das ich das lieber nicht weiter verfolgen sollte, weil noch mehr Grütze braucht die Welt nicht.

    Kannst Du/Kann mir einer ein gutes Buch empfehlen, wo ich so etwas vernünftig nachlesen kann, also wie man ein Programm vernünftig programmiert?
    Naja, wir wollen mal nicht übertreiben. Komplette Grütze jetzt nicht.

    Sehe es mal so. Aus der Fahrschule kommt mit 17 sicher kein Rennfahrer raus. Du bekommst das wichtigste mit auf dem Weg das du mal weist um was es geht, es liegt dann an dir dich zu verbessern.
    Je mehr KM du fährst desto besser wirst du werden, du wirst auch erst evtl. Unfälle bauen weil du mit einer gewissen neuen Situation nich umgehen konntest. Auch gewisse andere Situationen die du nicht lernst wie z.b. wie man korrekt und sanft ein anderes Auto abschleppt wirst du nicht in der Fahrschule lernen. Das musst du selbst "optimieren".

    Genauso ist es hier. Das Buch von Schwichtenberg habe ich auch und ist finde ich die richtige anlaufstellen, den Rest kann man hier über das Forum machen. Wichtig ist nur, nicht einfach nachschlagen wenn man ansteht. Ne, von der ersten Seite an lesen. Ist ja nicht mal viel in diesem Fall. Ich war nach 4 Tagen durch damit (das erste mal).

    Wie gesagt, ich kann dir gerne unter die Arme greifen, aber ich werde jetzt nicht versuchen aus irgendwelchen Schnipseln dein Model nachzuvollziehen um hier dein Problem nachstellen zu können, Entweder du stellst deinen Code hier ein oder du musst es leider alleine versuchen. Sorry, ohne genauen Angaben und deinem Model kann ich dir nicht Helfen. Aber vieleicht gibt es hier ja noch jemanden der mehr Erfahrung mit dem direkten Binden an DataGrids unter WinForms hat.
    Aber das Witzige ist. Ich weis zufällig das der Schwichtenberg in seinem Buch sogar explizit ein Beispiel mit einem DataGrid in seinem Buch hat und hier dann sogar auf das Problem mit dem LazyLoading eingeht. 8|

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    So, bin jetzt wieder zuhause. Naja, besser wäre ja hier im Forum hochladen damit andere aus was lernen.
    Ich werde es mir mal ansehen und hier meine Errungenschaft posten.

    Muss selbst mal ssehen wie man das am elegantersten unter WinForms macht. *gg*

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Nofear23m schrieb:

    EF generiert ein SQL und führt dieses aus. Anschliessend überführt es das Resultset in deine Entitäten und füllt die POCO Klassen.
    Wobei die Entitäten selbst im DGV aktualisieren würden.
    Crux sind vermutlich deine POCO-Klassen, wenn sie INotifyPropertyChanged nicht (oder falsch) implementieren. Weil INotifyPropertyChanged ist dafür verantwortlich, dass ein DGV sich aktualisiert, wenn die gebundenen Daten sich ändern.

    (Ich stimme dir übrigens zumindest teilweise zu - auch mir scheint das deutlich komplizierter als es eiglich notwendig sein sollte:
    Erst generiert EF ein umfassendes Datenmodell - inklusive Datenklassen, die INotifyPropertyChanged korrekt implementieren - aber man tut damit nix weiter, als es in POCO-Klassen umzufüllen, die man dann doch wieder selbst programmiert hat. :( )
    @kurzda

    Du hattest mir einen Link per Mail gesendet mit einem Projekt welches eine menge Abhängigkeiten zu Office usw. hatte. Das kann ich so nicht verwenden da ich es klarerweise nicht kompilieren kann.
    Ich habe nun ein sauberes Projekt erstellt welches sich auf das wesentliche konzentriert. Der einize Unterschied zu deinem ist das ich CodeFirst verwende, was aber für das Beispiel und wie gebunden werden kann unerheblich sein sollte.

    Da ich mich in WinForms nicht wirklich zurechtfinde ist die implementierung auch nur rudimentär.

    @ErfinderDesRades
    Welches Datenmodell generiert POCO Klassen mit InotifyPropertyChanged??? EF per Default aber nicht hoffe ich. Da haste schon dein eigenes T4 Template verwendet "WPF tauglich" gemacht oder?
    Im Grund ist und bleibt EF ja ein OR Mapper. Und der macht nichts anderes als Daten abzurufen und das Resultset (ja im Hintergrund wird mit Ado.Net ein Resultset empfangen) als POCO Klassen verfügbar gemacht.
    Was mir als Anwender des Framework das ganze erspart und erleichtert.

    Grüße
    Sascha
    Dateien
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Guten Morgen,

    Möchtig Gewaltig, Mächtig Gewaltig! Schnell zusammen gezimmert und 1000mal besser als mein Müll ;)

    Ja mit dem Hochladen ist das so ne Sache. Das ist eine unternehmensspezifische Anwendung, die ich für deine Hilfe schon ein Stückweit neutralisiert habe, damit du trotzdem drüber gucken kannst.
    Und ja mit den Abhängigkeiten kenne ich auch, brauche aber eine Excel-Verarbeitung und wollte ungern auf Microsoft zurückgreifen.

    Ich überlege im übrigen auf C# zu wechseln und hab schon bei Udemy einen Komplettkurs im Blick. Mal nebenbei gefragt was haltet Ihr von Udemy? Wurde mir in dem Zusammenhang empfohlen.

    Kurze Frage noch: Wie zum Hänker bindest Du die BindingSource ans DGV??? Den Code verstehe ich soweit, aber der Passus fehlt mir noch irgendwie.

    Kommt gut in den Tag & VG Axel

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