Daten im Hintergrund aktualisieren auf weiterem Client

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

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Spike.

    Daten im Hintergrund aktualisieren auf weiterem Client

    Hallo und Frohes Neues zusammen,

    habe mal wieder ein Problemchen wo ich derzeit nicht ganz weiter komme.
    Und zwar habe ich ein Programm geschrieben welches auf mehreren Clients läuft mittels Anmeldung.

    Nun habe ich das Problem, wenn Person A etwas innerhalb einer Datengebundenen DataGridView ändert oder neu hinzufügt aktualisiert sich die Tablle bei Person B auf dem anderen Client nicht.
    Zur Sicherheit habe ich eine Notification eingebaut worüber alle Clients allerdings den Hinweis erhalten das ein neuer Datenbankeintrag getätigt wurde, was auch klappt.

    Nun hat Person A quasi einen Eintrag mit der ID 212 neu hinzugefügt und gespeichert, dieser ist auch in der Datenbank bereits vorhanden.
    Person B sieht allerdings nur die letzte ID 211 und hat die Notification erhalten das ein neuer Eintrag vorhanden ist.
    Ja, er könnte es nun manuell Akualisieren, das funktioniert ebenfalls ohne Probleme.
    Auch über einen Ticker würde es hierbei funktionieren, was ich schon getestet habe.

    Ich hätte es allerdings gerne das nach der Notification ein Event ausgelöst wird, welches die Daten bei Person B einfach aktualisiert, statt einen Ticker zu aktivieren.
    Nun habe ich quasi nach dem Erhalt der Notification eine Public Sub aufgerufen, welches normalerweise dann die Daten neu laden soll, und obwohl es manuell bei dem Client funktioniert, funktioniert es aber nicht nach der Notification, obwohl alle Befehle durchlaufen werden, bleibt die Tabelle auf dem alten Stand und wird nicht neu geladen.

    Bei Ankunft der Notification auf dem Client wird quasi folgendes aufgerufen:

    VB.NET-Quellcode

    1. If New_Eintrag = 1 Then
    2. Alert(TCPServer_Nachricht, Form_Alert.alertTypeEnum.Success)
    3. frm_firmen.Firmen_Load(Nothing, Nothing)
    4. MsgBox("Inhalte sollten Reloaded sein!")
    5. New_Eintrag = 0
    6. End If

    1. Versuch: Hierbei hatte ich versucht die betreffende Form neu zu Laden, leider ohne Erfolg

    VB.NET-Quellcode

    1. If New_Eintrag = 1 Then
    2. Alert(TCPServer_Nachricht, Form_Alert.alertTypeEnum.Success)
    3. frm_firmen.Firmendaten_aktualisieren()
    4. MsgBox("Inhalte sollten Reloaded sein!")
    5. New_Eintrag = 0
    6. End If

    2. Versuch: Hierbei habe ich auf die Methode in der betreffenden Form zugegriffen und versucht dort dann die untenstehenden Befehle abzuarbeiten, auch dies lief zwar durch, hat aber nicht zu dem Ergebnis geführt das die Daten neu geladen wurden.

    VB.NET-Quellcode

    1. Public Sub Firmendaten_aktualisieren()
    2. System.Threading.Thread.Sleep(5000)
    3. Me.Verwaltung_firmendatenDataGridView.DataSource = Nothing
    4. Me.Verwaltung_firmendatenTableAdapter.Fill(Me.Finanz_managerDataSet.verwaltung_firmendaten)
    5. Me.Verwaltung_firmendatenDataGridView.DataSource = VerwaltungfirmendatenBindingSource
    6. Me.Verwaltung_firmendatenDataGridView.Refresh()
    7. Me.Verwaltung_firmendatenDataGridView.ClearSelection()
    8. Me.VerwaltungfirmendatenBindingSource.MoveLast()
    9. MsgBox("Es wurde alles durchgegangen")
    10. End Sub

    Bitte nicht wundern, ich hatte hierbei verschiedene Varianten getestet, aber es erbrachte nicht den Erfolg. Die MsgBox wurde zuletzt auch durchlaufen.

    Ich stehe derzeit etwas ratlos da.
    Habe ich einen falschen denkansatz oder liegt es hierbei am falschen Code :S

    Danke

    Gruss Spike
    Vermutlich aktualisierst du die Daten in einem anderen Form als welches du anguckst.
    VisualBasic schmeisst keinen Fehler, wenn ein Form unsachgemäss angesprochen wird, sondern erstellt eine unsichtbare Instanz.

    such mal in deim Code New frm_firmen, und poste die ganze methode, die diesen Aufruf enthält.
    @Spike
    meine Empfehlung..mach das nicht so.
    User sind eigen...Huch warum ändert sich mein Fenster, hab doch garnix gemacht !!

    die Idee mit dem Ticker ist doch ausreichend um User zu Informieren, aber glaube mir, es gibt
    auch User die genervt sind wenn ständig irgend eine Information auf dem Bildschirm erscheint

    zu der Ticker Idee
    nach dem Insert oder Update der Tabelle
    die Info in eine Text Datei speichern..

    die Text Datei oder mehrere Text Dateien mit dem FileSystemWtcher überwachen
    in Multiline Textbox änderungen anzeigen
    der User kann entscheiden ob er diese Multiline Textbox nutzen will oder nicht
    Ich stimme @Kasi zu. Finde die Info das es was neues gibt besser als das automatische aktualisieren... hab ich in meinem letzten Programm auch so gemacht.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Hallo zusammen,

    schuldigt die etwas späte Antwort, leider war es mir vorher nicht möglich zurückzuschreiben.

    @ErfinderDesRades

    ErfinderDesRades schrieb:

    such mal in deim Code New frm_firmen, und poste die ganze methode, die diesen Aufruf enthält.


    Hier der gewünschte Code:

    VB.NET-Quellcode

    1. Public Sub btn_firma_add_Click(sender As Object, e As EventArgs) Handles btn_firma_add.Click
    2. Dim frm As Form = frm_firmen
    3. Panel_Mainform.Controls.Clear()
    4. Panel_Mainform.Visible = True
    5. frm.TopLevel = False
    6. frm.TopMost = True
    7. frm_firmen.Firmen_Load(Nothing, Nothing)
    8. frm.Show()
    9. frm.Dock = DockStyle.Fill
    10. Panel_Mainform.Controls.Add(frm)
    11. Label_Location.Text = "Home / Firmen"
    12. End Sub


    Man muss dazu sagen das es eine Hauptform gibt, wo dieser obige Code enthalten ist und eine Panel_Mainform, wo dann die anderen formen reingeladen werden bei wechsel der Buttons.
    Hier noch von der Form "Hauptform" das MyBase.Load:

    VB.NET-Quellcode

    1. Private Sub Haushaltsprogramm_Mainform_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. Using frmLg = New frm_login
    3. If frmLg.ShowDialog(Me) <> Windows.Forms.DialogResult.OK Then
    4. Me.Close()
    5. Return
    6. End If
    7. LoggedInName = frmLg.txtbox_benutzer.Text
    8. End Using
    9. ' Verbindung zu Server aufbauen
    10. TCPStart()
    11. TimerPoll.Start()
    12. btn_dashboard.Tag = New Dashboard
    13. btn_buchung_edv.Tag = New frm_buchungen
    14. btn_firma_add.Tag = New frm_firmen
    15. End Sub


    @Kasi & @mrMo
    auch hier vielen Dank, ich glaube fast das ich es so umsetzen werde.
    Wie gesagt ein Nachrichtensystem über einen TCP Server gibt es bereits, sprich neuer Eintrag wird angelegt und diese Nachricht wird an den Server geschickt von Client-A.
    Dieser verteilt es nun an alle angemeldeten Clients B-Z. Die Clients erhalten die Nachricht in der Mainform wo sie dann ausgewertet wird.
    Anhand der Nachricht werden dann die jeweiligen DataGrids neu geladen in einem eigen dafür vorgesehenen Thread, so derzeit der Plan.

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

    ErfinderDesRades schrieb:

    Es ist nicht zu erkennen, dass es irgendwo gebraucht würde.


    Was meinst du den genau mit deiner Aussage " Es ist nicht zu erkennen, dass es irgendwo gebraucht würde"?

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

    Korrekt war ein Fehler, gut erkannt.
    Und meine Antwort alleinig dafür auch schon mehr als überflüssig, da du es ja gemerkt hast...
    Kann ja mal passieren, wa?!

    P.S. verbessert :thumbup:

    ErfinderDesRades schrieb:

    Hier gibts ein neues frm_firmen:

    Spike schrieb:

    VB.NET-Quellcode

    1. btn_firma_add.Tag = New frm_firmen
    Es ist nicht zu erkennen, dass dieses frm_firmen irgendwo gebraucht würde.


    Was soll ich damit meinen? Genau das: Es ist nicht zu erkennen, dass dieses frm_firmen irgendwo gebraucht würde. Also das frm_firmen aus post#5, zeile#18.

    Vielleicht wird es ja noch irgendwo gebraucht. Aber zu erkennen ist das nicht.
    Falle es aber nicht gebraucht wird, solltest du die Zeile löschen.
    Top und genau das hatte ich doch mit meinem Post#7 gemeint.
    Es stand im Load und wurde aber nirgends eingebunden, aus dem Grund habe ich auch geschrieben das ich es gelöscht habe, war quasi noch eine Altlasst.

    Ich sehe das eigentliche Thema nun erst einmal als - nunja - erledigt an.
    Dennoch danke!