locked
wait-Funktion für Properties RRS feed

  • Frage

  • Hallo,

    ich habe folgendes Problem, ich habe eine Feldeigenschaft, dass die Gesamtstunden von einem Mitarbeiter zurückgibt.

    In dieser Property wird immer aktuelle Eintrag aus der Datenbank gelesen. Habe das Problem, dass wenn ich über Binding den Wert von dem Feld darstellen will, dass beim ersten Aufruf immer den alten Wert ausgegeben wird und erst beim zweiten Aufruf den aktuellen und das liegt daran, dass wenn ich den Wert beim ersten Aufruf auslesen möchte, muss erst aus der Datenbank den aktuellen Eintragung gelesen werden und daher wird erstmal den alten Wert rausgegeben:

    public string test
            {
                get
                {
                    DataServiceClient proxyT = new DataServiceClient();
                    string command = "SELECT gesamtstunden FROM dbo.benutzer WHERE (id = '" + benutzer.Key + "')";
                    double totalMinuten = 0;
                    proxyT.selectSelbstDefiniertCompleted += (senderT, eT) =>
                    {
                        if (eT.Result.Count > 0)
                        {
                            for (int i = 0; i < eT.Result.Count; i += 2)
                            {
                                totalMinuten += Convert.ToDouble(eT.Result[i] + "");
                            }
                        }
                        gesamt = totalMinuten + "";
                    };
                    proxyT.selectSelbstDefiniertAsync(Anmelden.anmeldung[0], "kalender", Anmelden.anmeldung[1], Anmelden.anmeldung[2], command);
    
                    return gesamt;
                }
            }

    Weiß vielleicht jemand wie ich das Problem lösen kann?


    Gruesse, NUNUI

    Dienstag, 29. Oktober 2013 17:44

Antworten

  • Hallo,

    bevor es an das eigentliche Problem geht, 2 andere Hinweise von mir:

    • Je nachdem wie oft die Eigenschaft abgefragt wird, solltest du das Ausfragen vielleicht lieber in eine Seperate Update-Methode legen. Bei Eigenschaften neigt man dazu diese einfach x-Fach abzufragen ohne über die Leistungsverschwendung (da keine Wertänderung) nachzudenken.
    • Je nachdem wo benutzer.Key her kommt, ist vielleicht eine SQL-Injection möglich. Durch die Verwendung von Parametern kannst du dies verhindern.

    So, nun zum eigentlichen Problem. Nach der Zuweisung von gesamt im Eventhandler musst du die View über eine erneute Änderung benachrichtigen. Implementiere dazu INotifyPropertyChanged in deiner Klasse (Anleitung gibt es hier) und Löse das PropertyChanged-Event nach der Zuweisung aus.

    Nun weiß ich nicht, wie deine DataServiceClien-Klasse arbeitet. Eventuell liese sich das Asynchrone auch in einen Synchronen Befehl umwandeln. Das Verzögert aber die Reaktion der GUI (die Anwendung hängt), da die Abfrage eventuell etwas dauer kann.

    Wenn du meinen ersten Hinweis befolgst, dann hättest du das Problem garnicht, da der im Hintergrund gespeicherte Wert genutzt wird und nur durch Aufruf einer Methode die Daten aktualisiert werden.


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    • Als Antwort vorgeschlagen Stefan Falz Dienstag, 29. Oktober 2013 22:22
    • Als Antwort markiert Nunui Donnerstag, 31. Oktober 2013 17:05
    Dienstag, 29. Oktober 2013 18:04
  • Du könntest vor dem auslösen des Events ein Feld auf True setzen und nach dem Auslösen wieder auf False. Am Anfang des Getters fragst du den Zustand der Variablen ab. Ist er False, dann steuerst du die DB an, wenn nicht dann verwendest du den "alten" Wert.

    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    • Als Antwort markiert Nunui Donnerstag, 31. Oktober 2013 17:05
    Mittwoch, 30. Oktober 2013 15:58

Alle Antworten

  • Hallo,

    bevor es an das eigentliche Problem geht, 2 andere Hinweise von mir:

    • Je nachdem wie oft die Eigenschaft abgefragt wird, solltest du das Ausfragen vielleicht lieber in eine Seperate Update-Methode legen. Bei Eigenschaften neigt man dazu diese einfach x-Fach abzufragen ohne über die Leistungsverschwendung (da keine Wertänderung) nachzudenken.
    • Je nachdem wo benutzer.Key her kommt, ist vielleicht eine SQL-Injection möglich. Durch die Verwendung von Parametern kannst du dies verhindern.

    So, nun zum eigentlichen Problem. Nach der Zuweisung von gesamt im Eventhandler musst du die View über eine erneute Änderung benachrichtigen. Implementiere dazu INotifyPropertyChanged in deiner Klasse (Anleitung gibt es hier) und Löse das PropertyChanged-Event nach der Zuweisung aus.

    Nun weiß ich nicht, wie deine DataServiceClien-Klasse arbeitet. Eventuell liese sich das Asynchrone auch in einen Synchronen Befehl umwandeln. Das Verzögert aber die Reaktion der GUI (die Anwendung hängt), da die Abfrage eventuell etwas dauer kann.

    Wenn du meinen ersten Hinweis befolgst, dann hättest du das Problem garnicht, da der im Hintergrund gespeicherte Wert genutzt wird und nur durch Aufruf einer Methode die Daten aktualisiert werden.


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    • Als Antwort vorgeschlagen Stefan Falz Dienstag, 29. Oktober 2013 22:22
    • Als Antwort markiert Nunui Donnerstag, 31. Oktober 2013 17:05
    Dienstag, 29. Oktober 2013 18:04
  • Vielen Dank für die ausführliche Antwort. Leider die Abfrage muss Asynchron laufen, da die Abfrage über eines Webservices läuft (Silverlight). Und die Idee mit INotifyPropertyChanged ist genau das, was ich brauche. Erneut, VIELEN DANK!!!

    Gruesse, NUNUI


    • Bearbeitet Nunui Dienstag, 29. Oktober 2013 22:09
    Dienstag, 29. Oktober 2013 22:09
  • Hallo Koopakiller,

    es funktioniert soweit alles super, habe aber jetzt ein anderes Problem und nämlich, dass das ganze zu einer rekursiven Abfrage wird!

    Da sobald das PropertyChanged-Event ausgelöst wird, wird beim Holen dann doch erneut eine Datenbankabfrage abgesetzt, die das Event dann wieder auslöst usw.!

    Hast Du vielleicht eine Idee, wie ich das verhindern kann?


    Gruesse, NUNUI



    • Bearbeitet Nunui Mittwoch, 30. Oktober 2013 15:38
    Mittwoch, 30. Oktober 2013 15:36
  • Du könntest vor dem auslösen des Events ein Feld auf True setzen und nach dem Auslösen wieder auf False. Am Anfang des Getters fragst du den Zustand der Variablen ab. Ist er False, dann steuerst du die DB an, wenn nicht dann verwendest du den "alten" Wert.

    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    • Als Antwort markiert Nunui Donnerstag, 31. Oktober 2013 17:05
    Mittwoch, 30. Oktober 2013 15:58
  • SUPER, es funktioniert jetzt wunderbar!

    Erneut Vielen Dank für die Mühe :o)


    Gruesse, NUNUI

    Mittwoch, 30. Oktober 2013 17:17