none
[Entity Framework / ASP.net / C#] - Performantere Listview.

    Allgemeine Diskussion

  • Hallöchen,

    Ich möchte heute eine Frage stellen, wie ich meine Listview performanter gestalten kann.
    Dazu mein bisheriges Vorgehen und mein Ziel, das ich habe. Plus das ein oder andere Problem auf das ich bereits gestoßen bin.
    Fangen wir an mit dem

    Ist-Zustand:
    Ich habe eine Page. Auf dieser Page ist eine Listview und eine Datasource. Die Datasorce holt eine Liste von Pfaden aus einer SQL - Datenbank. Diese Pfade zeigen auf einen Ordner in dem sich Bilder verbergen.
    Beim Databinding - Event der Listview wird nun einiges gemacht. Jedes Bild das der eingeloggte Benutzer gerade aufrufen will, wird überprüft, und anhand bestimmter Kriterien die dem Benutzer inne sind, dargestellt. Mal Verschlüsselt, mal verlogot .
    Diese dafür notwendigen Routinen gibt es alle schon und die funktionieren. Ferner muss noch erwähnt werden, dass natürlich nicht das mehrere MB große Bild direkt, sondern nur ein herunter gerechnetes Thumbnail hier verwendet wird.
    Anhand eines Buttons, der in jedem Listview-Item und somit unter jedem Bild zu finden ist, dass noch verschlüsselt ist, kann der Benutzer dies nun entschlüsseln lassen. Dazu wird dann in seinen Eigenschaften gespeichert dass das Bild Z in Galerie F nun für diesen Benutzer frei ist. Anschließend wird die Anzahl an freigegebenen Bildern neu Berechnet und in einer Statusleiste in der Masterpage dargestellt.

    All das Funktioniert nun schon, allerdings unperformant..

    Das Problem:
    Das Berechnen uns anzeigen der freigegeben Bilderanzahl auf der Masterpage geschieht BEVOR ich im Button-Click-Event der Page den Datenbankeintrag machen muss. Die neuen Daten werden erst angezeigt, wenn ich die ganze Seite erneut lade.
    Der problematische Ablauf:

    Masterpage_Load:
    Berechnen der Anzahl der freigeschalteten Bilder des Benutzers
    ButtonClick:
    Select des gewählten Items und Aktion festlegen (freischalten)
    ItemSelected:
    ID des selektierten Items in der Datenbank für den Benutzer als freigegeben Speichern
    aufrufen von Listview.DataBind() um die Items zu aktualisieren und dem Benutzer das Bild als Freigeschaltet darzustellen.
    anschließend neu laden der Page durch.. (diese blöde Zeile vergesse ich immer wieder. irgendwas mit "Response" oder so)
    damit die Masterpage das berechnen der Anzahl der freigegebenen Bilder nochmal macht.


    Meine Überlegung / Vorstellung / Hoffnung / Frage :

    ich habe mir überlegt, ob es nicht möglich ist irgendwie nur ein ListView-Item neu zu laden.
    Oder hat jemand jetzt beim Lesen schon den so genannten "facepalm" hinter sich, und sagt sich... Junge du machst ja alles FALSCH... las Daddy mal ran.
    Dann bin ich sehr über eure Ratschläge gespannt.


    PS: Da ich gerade auf Arbeit bin, kann ich leider keinen Code einreichen... Ich wüsste gerade auch nicht wirklich welchen da es soooo viel ist. Aber auf Anfrage nach bestimmten Teilen, reiche ich den heute Abend gerne ein wenn ich zuhause und am Code bin.

    Liebe Grüße und großes Danke im Voraus...
    Kevin
    Mittwoch, 2. Oktober 2013 05:05

Alle Antworten

  • Hi,
    wenn es nicht möglich ist, das Laden und Berechnen so  im Lebenszyklus der Seite unterzubringen, dass unterschiedliche Vorgänge parallel ausgeführt werden und erst im PreRender auf das Ende der einzelnen parallelen Vorgänge gewartet wird, dann bietet sich die Anwendung von UpdatePanels an, die nur Teile der Seite neu laden und darstellen.

    --
    Peter

    Mittwoch, 2. Oktober 2013 08:06
  • Richtig, an Updatepanels habe ich auch schon gedacht. ABER:

    Die ListView in ein Updatepanel zu packen wäre sinnlos, da ich dann dennoch alle Bilder neu laden müsste. Aufwandsmäßig wäre da nichts gespart.

    Das einzig sinvolle wäre jedes einzelne Item der ListView in ein UpdatePanel zu packen.

    Da stellt sich aber die Frage, ob das WIRKLICH sinnvoll ist, und vorallem, ob das überhaupt geht. Da ich ja das das DataBinding event nur für das eine Item im UpdatePanel aufrufen müsste.. irgendwie..

    --

    Kevin

    Mittwoch, 2. Oktober 2013 08:10
  • Hi,
    ich denke, dass es geht, viele UpdatePanels in einer Seite einzusetzen. im CodeBehind fragst Du dann nur ab, wer sich gemeldet hat, und renderst nur den betreffenden Teil. Ich habe so etwas schon gemacht, aber noch nicht im ListView.

    --
    Peter

    Mittwoch, 2. Oktober 2013 13:57
  • Hi,

    für mich hört sich das an wie "ich hab schon mal angefangen"...also erstens:

    - wenn denn die Auswertung unbedingt in der Masterpage stattfinden muss (man weiß ja vom LifeCycle das die Masterpage als letztes drankommt gell) machst du entweder ein Response.Redirect auf die selbe Url -> Performance lastig; oder eine Methode in der Masterpage die du in der Seite aufruftst.

    Ich denke nicht das deine Performance-Probleme daher kommen...ich denke das kommt von "Nichtwissen" wie z.B.:
    (diese blöde Zeile vergesse ich immer wieder. irgendwas mit "Response" oder so) - das könnte man echt in ein Buch schreiben so .... ist das

    oder

    Da stellt sich aber die Frage, ob das WIRKLICH sinnvoll ist, und vorallem, ob das überhaupt geht. Da ich ja das das DataBinding event nur für das eine Item im UpdatePanel aufrufen müsste.. irgendwie..

    Wenn du Performance willst würde ich ohne EntityFramework anfangen und selbst SQL schreiben
    - und dann solltest du mal den LifeCycle einer ASP Anwendung untersuchen und verstehen was ein Page Load, Postback und Eventhandler ist.

    Warum benutzt Ihr kein fertiges System oder einen richtigen Programmierer?



    • Bearbeitet Techtwebty Mittwoch, 2. Oktober 2013 14:36
    Mittwoch, 2. Oktober 2013 14:31
  • Okay also guten Morgen erst einmal.

    @Techtwbty: Genau Response.Redirect wars. Aber hat nicht jeder so einen Befehl den er zwar öfter mal braucht aber sich in der genauen Schreibweise einfach nicht merken kann? Meiner Meinung nach, sollte das jetzt kein Grund sein sich daran hochzuziehen!.

    Aber ja, einen Response.Redirect wende ich bereits an, nachdem der LifeCycle einmal durchgelaufen, und meine eigentliche Seite das Button.Click - Event abgearbeitet hat.

    Das Mit der öffentlichen Methode, die von der meiner SubPage aufgerufen, hört sich natürlich genial an. Dann muss ich nicht noch einmal den ganzen LifeCycle durchlaufen, nur um ein Label auf der MasterPage zu aktualisieren.

    Was die ListView angeht, bin ich am Wochenende noch auf die Idee gekommen, dass man das Ganze in Pages fassen kann. Somit ist noch weniger zu Laden. (Also nur 8 Elemente und keine 30)

    Die Frage, warum "wir" da kein fertiges System verwenden. Weil ich das nicht will. Ich will’s selber machen. Das Ganze ist ein Freizeitprojekt zum erlernen Grundlegender Kenntnisse des Entity - Frameworks. Würde ich ein fertiges System nehmen, wäre es langweilig und nicht.. naja.. es wäre nicht meins =) Ich hoffe das kannst du n bisschen verstehen.

    Weiter im Text: Ich bin ein wenig Verwirrt was deine Aussage: "(man weiß ja vom LifeCycle das die Masterpage als letztes drankommt gell)" angehtDenn so ganz kann man das ja irgendwie nicht abgrenzen. Die MasterPage ist vielleicht als letztes fertig, OK. Aber deren Load-Event, wird noch vor dem ButtonClick der SubPage ausgeführt.

    Aber natürlich... Ich könnte doch das Aktualisieren des Labels auf der MasterPage in eines der letzten Events der MasterPage packen und hätte somit immer den aktuellen Stand.

    Mal sehen ob sich da was machen lässt.

    Montag, 7. Oktober 2013 05:54
  • *****************************************************************************************************

    Dieser Thread wurde mangels weiterer Beteiligung  ohne bestätigte Lösung abgeschlossen.

    Neue Rückfragen oder Ergänzungen zu diesem Thread bleiben weiterhin möglich.

    *****************************************************************************************************

    Ciprian Bogdan, MICROSOFT   Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-PrinzipEntwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.





    Dienstag, 11. März 2014 19:10
    Besitzer