Ladebild während großer Abfrage

  • VB.NET

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

    Ladebild während großer Abfrage

    Ich erstelle grad ein kleines InfoFenster in ASP.net und dort habe ich Anfragen, deren Bearbeitung schon ein wenig dauert ...

    Also dachte ich mir, füge ich ein Bild hinzu, welches ich vor Beginn der Abfrage sichtbar mache und welches danach wieder verschwindet.

    Das steht also im Page_Load:

    VB.NET-Quellcode

    1. With Image1
    2. .ImageUrl = "~/images/ajax-loader(1).gif"
    3. .Visible = False
    4. End With


    Über das jeweilige Menü, wird die Anfrage gestartet...

    VB.NET-Quellcode

    1. Protected Sub Menu1_MenuItemClick(sender As Object, e As System.Web.UI.WebControls.MenuEventArgs) Handles Menu1.MenuItemClick
    2. Image1.Visible = True
    3. If type = 4 Then
    4. MieterAkte()
    5. ElseIf type = 5 Then
    6. ObjektAkte()
    7. ElseIf type = 10 Then
    8. VorgangAkte()
    9. End If
    10. 'Image1.Visible = false
    11. End Sub


    Leider funktioniert es nicht, so wie ich mir das denke...
    Er soll eigentlich das Bild sichtbar machen und dann die Abfrage starten.

    Er startet aber sofort die Anfrage und zeigt das Bild auch erst, wenn die Anfrage schon durch ist...

    Es ist keine WindowsForm ! (Thx to mike)

    Wie kann / muss ich hier vorgehen damit es so ausgeführt wird, wie ich es beschrieben habe?

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

    Du kannst mit "PictureBox1.LoadCompleted" abfangen, wann bzw. ob das Bild vollständig geladen ist und dann deine Aktionen durchführen.
    Wobei ich nicht verstehe wieso er ein Click durchführt, bevor er mit Me.Load abgeschlossen ist. Entweder da fehlt Code, oder ich habe es missverstanden.

    Hatschi schrieb:

    Du kannst mit "PictureBox1.LoadCompleted" abfangen, wann bzw. ob das Bild vollständig geladen ist und dann deine Aktionen durchführen.


    Werd ich mal testen

    Hatschi schrieb:

    Wobei ich nicht verstehe wieso er ein Click durchführt, bevor er mit Me.Load abgeschlossen ist. Entweder da fehlt Code, oder ich habe es missverstanden.


    Also im Page_Load setzt er das Bild auf visible=false <= soll auch so sein
    und wenn ich dann einen Menu1.MenuItemClick mache, soll er erst visible=true setzen und danach die anderen Fkt. aufrufen...

    Noch etwas unklar?


    €dit:
    Es gibt gar keine Picturebox in asp - <asp:Image ID="Image1" runat="server"> <= das is das Image im Designer.
    Und es gibt dort kein .LoadCompleted

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

    dein prob ist, dass deine Abfrage im HauptThread stattfindet, und daher kann dein Bild nicht angezeigt wern, weil ja der HauptThread mitte Abfrage beschäftigt ist. Lösung: Threading.
    Das ist aber ein ganzer Rattenschwanz, weil du mußt ja das Bildle laden, die Abfrage abfahren, horchen ob die Abfrage erledigt ist, und dann das Bildle wieder weghauen.

    Ein Standard-Task, denich in AsyncWorker - CodeProject behandel
    Hallo Don_Basto,

    Warum geht das bei asp nich so?

    das macht er in ASP.NET auch.

    Nur lebt eine ASP.NET Seite ganz anderst als eine VB.NET WindowsForm Anwendung.
    Das sind zwei völlig verschiedene Geschichten.

    Das einzig Gemeinsame ist die Basis des dotNet FRameworks.

    Tipp:
    Handelt es sich um keine WindowsForm Anwendung solltest du das im Eröffnungspost klar machen.

    Gruss

    mikeb69
    @Mike: Post 1 ist bearbeitet

    @ll:
    Ich habe "asp.net asyncworker" mal an Google übergeben und eines der Ergebnisse ist der Link, den ErfinderDesRades gepostet hat.
    Also habe ich mir von da die Klasse AsyncWorker.vb geholt und sie zu meinem Projekt hinzugefügt.
    Allerdings habe ich nun diese Meldung und zwar sehr häufig: Der Typ "System.Web.UI.Page" ist nicht definiert - an allen Stellen wo ich "Inherits System.Web.UI.Page" drin habe...

    Da ich das aber nicht wegnehmen kann, sieht es für mich so aus, als hilft mir der AsyncWorker auch nicht...

    Gibt es ansonsten eine Möglichkeit irgendwie einen Ladebalken oder ähnliches einzufügen?
    Habe nun das:

    VB.NET-Quellcode

    1. Dim NewThread As Thread = New Thread(AddressOf changeVisibility, 1)
    2. NewThread.Priority = ThreadPriority.Highest
    3. NewThread.Start()
    4. '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    5. Dim NewThread2 As Thread = New Thread(AddressOf startResearch, 1)
    6. NewThread2.Priority = ThreadPriority.Lowest
    7. NewThread2.Start()
    drin.

    Er macht auch schön das Bild sichtbar, aber ich glaube er macht den 2. Thread - ich warte immer noch...

    Ist das ansonsten so richtig?

    3 Wege - kein 100%tiges Ziel

    Also
    wenn ich die Fkt. der BildSichtbarkeit in einen Nebenthread setzte und die ResearchFkt. so normal starte, wird das Bild erst wieder gezeigt, wenn Research fertig ist...
    wenn ich die Research-Fkt. in einen Nebenthread setze und die BildFkt. normal starte, kommt zwar das Bild aber bei der Suche passiert nix...
    wenn ich beide Fkt. in Nebenthreads setze, kommt diese Meldung:
    Gut also ich habs jetzt gelassen und bin, wenn auch nich mein liebstes, über JS gegangen...

    VB.NET-Quellcode

    1. Response.Write("<div id='mydiv' STYLE='FONT-WEIGHT: bold; FONT-SIZE: 11pt; COLOR: black; FONT-FAMILY: Verdana; POSITION: absolut; TOP: 140px; TEXT-ALIGN: center() ' >")
    2. Response.Write("&nbsp;")
    3. Response.Write("</div>")
    4. Response.Write("<script> var mydiv = document.getElementById('mydiv'); mydiv.innerText = '';</script>")
    5. Response.Write("<script language=javascript>")
    6. Response.Write("var dots = 0;var dotmax = 10;function ShowWait()")
    7. Response.Write("{var output; output = 'Generating Report. Please wait() ';dots++;if(dots>=dotmax)dots=1;")
    8. Response.Write("for(var x = 0;x < dots;x++){output += '.';}mydiv.innerText = output;}")
    9. Response.Write("function StartShowWait(){mydiv.style.visibility = 'visible';ShowWait();ShowWait();window.setInterval('ShowWait()',10);}")
    10. Response.Write("function HideWait(){mydiv.style.visibility = 'hidden';window.clearInterval();}")
    11. Response.Write("StartShowWait();</script>")
    12. Response.Flush()


    Wer will, kann sich das gern kopieren, die Anfrage muss danach gestartet werden und sie ist dann so lange da, bis die Anfrage fertig ist!