2012-04-02 4 views
0

Alle,Aktualisieren des UI-Threads innerhalb einer Schleife: ASP.NET Webforms

Ich habe ein Update Panel-Steuerelement, das ein Label-Steuerelement enthält. Ich habe auch eine Zeitsteuerung, deren Intervall auf 1 Sekunde eingestellt ist. Das Zeitsteuerelement soll den Text des Beschriftungssteuerelements jede Sekunde mit dem Wert einer öffentlichen Eigenschaft festlegen, der sich nach jeder Iteration der Schleife ändert.

Die resultierende Funktionalität ist jedoch, dass nach Abschluss der gesamten Schleife die Benutzeroberfläche aktualisiert wird. Ich würde gerne wissen, was getan/codiert werden müsste, um sicherzustellen, dass das Label-Steuerelement nach jeder Iteration der Schleife mit dem Wert der Eigenschaft _servername aktualisiert wird.

Heres mein Code:

<form id="form1" runat="server"> 
<asp:ScriptManager ID="ScriptManager1" runat="server"> 
</asp:ScriptManager> 
<asp:Timer ID="tmr" runat="server" Interval="1000" ontick="tmr_Tick"> 
</asp:Timer> 
<div> 
    <asp:UpdatePanel ID="udp1" runat="server" UpdateMode="Conditional"> 
     <Triggers> 
      <asp:AsyncPostBackTrigger ControlID="tmr" EventName="Tick" /> 
     </Triggers> 
     <ContentTemplate> 
      <asp:Label ID="lblInserts" runat="server" /> 
     </ContentTemplate> 
    </asp:UpdatePanel> 
    <asp:UpdateProgress runat="server" ID="udprg1" AssociatedUpdatePanelID="udp1" 

     DisplayAfter="10"> 
     <ProgressTemplate> 
      <img src="media/ajaxloaderBlueLoading.gif" alt="ProgressImage" /> 
     </ProgressTemplate> 
    </asp:UpdateProgress> 
    <div id="_asyncCallsMadeDiv"></div> 
</div> 
</form> 

// Code hinter

public string ServerName 
    { 
     get { return _serverName; } 
     set { _serverName = value;} 
    } 



    protected void tmr_Tick(object sender, EventArgs e) 
    { 
      lblInserts.Text = ServerName; 
    } 

    protected void btnUpload_Click(object sender, EventArgs e) 
    { 

     //Loop through data 
     while((line = rdr.ReadLine()) != null) 
     { 
      string [] arrayline = line.Split(','); 

      ServerStatus s = new ServerStatus 
      { 
       ServerName = arrayline[0], 
       Purpose = arrayline[1], 
       Primary = arrayline[2], 
       Secondary = arrayline[3], 
       OS = arrayline[4], 
       MachineType = arrayline[5], 
       Comments = arrayline[6], 
       VMTools = arrayline[7], 
       TimeSettings = arrayline[8], 
       LastPatchDate = arrayline[9], 
       CARemoval = arrayline[10], 
       PLUpdate = arrayline[11], 
       DefaultGatewayChange = arrayline[12] 
      }; 

      _serverName = arrayline[0]; 
    } 
+0

Ihr ASPX-Markup und Code-Behind scheint fast nichts miteinander zu tun. Laut Ihrem Kommentar sollte "tmrUdp1" 'tmr' sein und den Ereignishandler' tmr_Tick' aufrufen. Dieser Ereignishandler aktualisiert jedoch eine Bezeichnung, die nicht im aspx-Markup vorhanden ist. Ich nehme an, dass sollte "ltlCount" stattdessen sein? Könnten Sie damit beginnen, entweder Ihren Aspx oder Code-Behind zu reparieren? –

+0

@GuthMD und CheckRaise, Entschuldigung für die Tippfehler. Auch sollte jetzt lesbar sein. –

+0

Können Sie den btnUpload_Click-Handler erklären? Woher kommt 'line'? Die Operationen dort sehen ziemlich einfach aus, und ich würde erwarten, dass die gesamte Schleife in weniger als einer Sekunde abgeschlossen wird. Du möchtest, dass es oft auf deine Seite postbackt? –

Antwort

0

Die onTick Eigenschaft Ihrer Timer-Steuerung ist auf ein Verfahren festgelegt, das nicht existiert. Sie können die Methode tmr_Tick in Ihrem Code hinter tmrUdp1_Tick umbenennen oder die Eigenschaft onTick auf tmr_Tick setzen.

+0

Das ist ein Tippfehler das die aktualisierte Zeitsteuerung: