Laden...

Aktualisierung einer TextBox während dem Page_Load-Ereignis

Erstellt von Abt vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.307 Views
Abt Themenstarter:in
16.807 Beiträge seit 2008
vor 15 Jahren
Aktualisierung einer TextBox während dem Page_Load-Ereignis

Hi,

ich würde gern eine TextBox ( Statusfenster von einem Buildprozess ) während der Buildprozess läuft.
Dieser dauert 2-3 Minuten.

Aufbau der Seite:

                <!-- Build >> STATUS -->
                <asp:UpdatePanel ID="Upanel_build_status" runat="server" UpdateMode="Conditional">
                    <ContentTemplate>
                        <div id="container_build_status" runat="server" visible="true" style="margin-top: 20px;">
                            <div style="border: dashed gray 1px; width: 422px;">
                                <div class="table_CS_ReleaseHeader">
                                    <asp:TextBox ID="TextBox_build_status" TextMode="MultiLine" runat="server" Width="400px"
                                        CssClass="releaseBox" />
                                </div>
                            </div>
                        </div>
                    </ContentTemplate>
                </asp:UpdatePanel>

Während dem Buildprozess rufe ich je nach Position eine Funktion auf:

 private void AddStatusText(string a_text)
        {
            if (TextBox_build_status.Text == "")
            {
                TextBox_build_status.Text = a_text;
            }
            else
            {
                TextBox_build_status.Text += "\n" + a_text;
            }

            Upanel_build_status.Update();
        }

Diese aktualisiert aber nicht wie gewünscht das Updatepanel und die darin enthaltene TextBox ( wahrscheinlich, weil die Page noch nicht fertig ist ), sondern haut alles am Schluss raus, was so nicht gewünscht ist. Ein paar Erklärungen in diesem Forum bestätigen auch die Vermutung.
Aber der Anwender soll schließlich wissen, was gerade passiert.

Wie umgeh / lös' ich das Problem?
Ein WebService? Ein JavaScript, das mit ne XML mit den aktuellen Statusmeldungen in den Container läd?

Ich möchte so wenig manuellen Code wie auch nur möglich eingeben müssen.
Danke für nen Tipp.

Grüße Abt

26 Beiträge seit 2009
vor 15 Jahren

Hallo Abt,

Wenn ich Dich richtig verstanden habe möchtest Du auf einer ASP.Net Seite eine Textbox anzeigen, die realtime irgendwelche Ausgaben eines Serverprozesses anzeigt. ?(

Die einzige Technologie, die mir dazu einfällt ist AJAX !?

Gruß,
Thomas van Veen

Abt Themenstarter:in
16.807 Beiträge seit 2008
vor 15 Jahren

Richtig, ich habe eine TextBox, die mir den aktuellen Stand meines Prozesses anzeigt.
Gefüttert wird diese TextBox über eine Funktion, die durch einen Button-Click-Event gestartet wird.

Die TextBox befindet sich in einem Ajax-Updatepanel (siehe erster Post).
Das UpdatePanel wird über die Funktion .Update() zur Aktualisierung gebracht, was aber nicht funktioniert.

Erst wenn die Funktion beendet ist, und die Page neu geladen ist ( trotz UpdatePanel ), wird der Inhalt der TextBox angezeigt.

Kleiner Ausschnitt:

private void OnButtonStartBuildClick(object a_sender, EventArgs a_eArgs)
{
            // Container
            container_build_status.Visible = true;
            Upanel_build_status.Update();

            AddStatusText("CHECK - Selection...");
            // Check Selection
            string a_selectedRelease = DDL_SeriesList.SelectedValue;
            string a_selectedMedia = DDL_MediaSelection.SelectedValue;

            if (DDL_SeriesList.SelectedIndex == 0)
            {
                AddStatusText("... please select a valid release");
                return;
            }
            else if (a_selectedRelease == string.Empty || a_selectedRelease.Trim() == "")
            {
                AddStatusText("... please select a valid release");
                return;
            }
            AddStatusText("... finished");

            AddStatusText("Release Order...");
            // Get Release Selection
            Dictionary<string, string> a_releaseOrder = TcBuild.GetReleaseInstallationOrder(a_selectedRelease);
            AddStatusText("... finished");

            // Check Release
            AddStatusText("CHECK - Release ...");
            List<string> a_releaseCheck = TcBuild.CheckRelease(a_releaseOrder, a_selectedMedia);
}

Die relevante Funktion "AddStatusText" findet sich im ersten Post.

3.003 Beiträge seit 2006
vor 15 Jahren

Du bist auf dem falschen Weg. Die Seite wird erst an den Browser geschickt, wenn der Page-Lifecycle vorbei ist, insbesondere also, wenn Page_Load beendet ist. Der Browser kriegt sein HTML+Javascript also erst, wenn der Server längst fertig ist mit der Berechnung. Das Aufrufen von Update() gaukelt nur vor, dass du dem Browser etwas schicken würdest. "Der Browser fragt regelmäßig nach, und dann wird eine Antwort gesendet" ist vermutlich die bessere Beschreibung.

Mit den Standard-Werkzeugen wirst du hier nicht so recht weiterkommen. Ein Service, der den Prozess anstartet und Auskunft (meinetwegen in Textform) über den Fortschritt geben kann, und der mit einem UpdatePanel kommuniziert, das einen sehr kurzen Aktualisierungszeitraum hat - das wäre vermutlich noch die programmierärmste Variante (mit AJAX Extensions und den Bordmitteln).


Ich möchte so wenig manuellen Code wie auch nur möglich eingeben müssen.

Hm. Du möchtest also programmieren, aber möglichst, ohne zu programmieren? 😉
"No Code". Das hätte man MS aber von vornherein sagen können, dass die Kampagne nach hinten losgeht.

Gruß,

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

Abt Themenstarter:in
16.807 Beiträge seit 2008
vor 15 Jahren
  
Ich möchte so wenig manuellen Code wie auch nur möglich eingeben müssen.  
  

Hm. Du möchtest also programmieren, aber möglichst, ohne zu programmieren? 😉

Gruß,

LaTino

Manueller Code im Sinne von selbst geschriebenem Javascript.
Bessere Ausdruckweise wäre gewesen: möglichst alles in C# 😉

Werde mal die Variante mit dem Service in Angriff nehmen...

Danke soweit.