2017-07-06 2 views
0

Ich habe einen Prozess, der eine Reihe von Aufgaben ausführt und mit jeder Aufgabe aktualisiert ein Textfeld, mein Problem ist jedoch, dass der Bildschirm nicht geladen wird, bis alle Aufgaben erledigt sind, und ich muss sie als sehen sie passieren. In meiner alten Sprache von VBA wäre dies DoEvents oder Me.Repaint gewesen. Was mache ich falsch, weil meine Textbox nicht jedes Mal anzeigt, was gesendet wird, wenn etwas an sie gesendet wird?Aktualisieren eines Textfelds auf dem Bildschirm

Dies ist in ASP.net und C#. Dies ist die aspx Seite: -

<%@ Page Title="ASC Open" Language="C#" AutoEventWireup="true" CodeBehind="ASC_OSC.aspx.cs" Inherits="HICS.ASC_OSC" %> 

<head runat="server"> 
    <title>HICS</title> 
    <meta charset="utf-8" /> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 
    <asp:PlaceHolder runat="server"> 
     <%: Scripts.Render("~/bundles/modernizr") %> 
    </asp:PlaceHolder> 
    <webopt:BundleReference runat="server" Path="~/Content/css" /> 
</head> 
<body style="padding-top: 5px"> 
    <form id="main" runat="server"> 
     <div class="container-fluid" style="padding-top: 0px"> 
      <h1>Open Access Supply Chain</h1> 
      <hr /> 
      <div class="container-fluid"> 
       <div ID="ContRow" class="row"> 
       <div class="col-md-12"> 
        <asp:TextBox ID="TxtStatus" runat="server" Height="80%" Width="80%" ReadOnly="true" Wrap="true" AutoPostBack="false" TextMode="MultiLine"></asp:TextBox> 
       </div> 
       </div> 
      </div> 
     </div> 
    </form> 
</body> 

Und das ist das Snippet von C# (nicht alle zeigen, wie es repräsentativ ist), ist es TxtStatus, die ich jetzt gerade über interessieren.

using System; 
//using System.Collections.Generic; 
//using System.Linq; 
//using System.Web; 
using System.Web.UI; 
//using System.Web.UI.WebControls; 
//using System.Web.UI.HtmlControls; 
using System.Data.SqlClient; 
using System.Diagnostics; 
using System.Runtime.InteropServices; 

namespace HICS 
{ 
    public partial class ASC_OSC : Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      SqlDataReader RS; 
      int  IntPort; 
      int  IntEnvironment; 
      bool BlnOK; 
      string StrEnvironmentName; 
      string StrEnvironmentDB; 
      Database DB_ASC = new Database(); 


      if (!IsPostBack) 
      { 
       BlnOK = true; 
       TxtStatus.Text += "Getting Port: "; 
       string StrReturn = home.Procs.UserSetting("ASC_Port"); 
       if (StrReturn == "" || StrReturn == "0") 
       { 
        RS = home.DB_HICS.GetRS("SELECT MAX([ASC_Port]) FROM [Tb_Users]"); 
        RS.Read(); 
        IntPort = (RS.GetInt32(0) < 4444)? 4444 : RS.GetInt32(0) + 1; 
        home.Procs.UserSetting("ASC_Port", IntPort.ToString()); 
        RS.Close(); 
       } 
       else 
       { 
        IntPort = Convert.ToInt32(StrReturn); 
       } 
       TxtStatus.Text += String.Concat(IntPort.ToString() , Environment.NewLine); 

       TxtStatus.Text += "Getting Environment: "; 
       IntEnvironment = 0; 
       StrReturn = home.Procs.UserSetting("ASC_Environment"); 
       if (StrReturn == "" || StrReturn == "0") 
       { 
        RS = home.DB_HICS.GetRS("SELECT MIN([ID]) FROM [Tb_ASC_Environments]"); 
        RS.Read(); 
        if (RS.IsDBNull(0)) 
        { 
         BlnOK = false; 
        } 
        else 
        { 
         IntEnvironment = RS.GetInt32(0); 
         home.Procs.UserSetting("ASC_Environment", IntEnvironment.ToString()); 
        } 
        RS.Close(); 
       } 
       else 
       { 
        IntEnvironment = Convert.ToInt32(StrReturn); 
        RS = home.DB_HICS.GetRS("SELECT COUNT([ID]) FROM [Tb_ASC_Environments] WHERE [ID] = " + IntEnvironment); 
        RS.Read(); 
        if (RS.GetInt32(0)==0) 
        { 
         RS.Close(); 
         RS = home.DB_HICS.GetRS("SELECT MIN([ID]) FROM [Tb_ASC_Environments]"); 
         RS.Read(); 
         if (RS.IsDBNull(0)) 
         { 
          BlnOK = false; 
         } 
         else 
         { 
          IntEnvironment = RS.GetInt32(0); 
          home.Procs.UserSetting("ASC_Environment", IntEnvironment.ToString()); 
         } 
        } 
        RS.Close(); 
       } 
       TxtStatus.Text += String.Concat((BlnOK)?IntEnvironment.ToString():"Error", Environment.NewLine); 

       if (BlnOK) 
       { 
        RS = home.DB_HICS.GetRS("SELECT [Name],[Database] FROM [Tb_ASC_Environments] WHERE [ID] = " + IntEnvironment); 
        RS.Read(); 
        StrEnvironmentName = RS.GetString(0); 
        StrEnvironmentDB = RS.GetString(1); 
        TxtStatus.Text += String.Concat("Environment Name: ", StrEnvironmentName, Environment.NewLine); 
        TxtStatus.Text += String.Concat("Environment Database: ", StrEnvironmentDB, Environment.NewLine); 
        TxtStatus.Text += "Connecting to ASC Database: "; 

       } 
      } 
     } 
    } 
} 
+0

Sie müssten einen Prozess im Hintergrund auslösen und einen anderen Endpunkt für den Status mithilfe von AJAX-Anforderungen abfragen (z. B. mithilfe von jQuery), wodurch das Textfeld aktualisiert würde. – ps2goat

+0

Ah wow, das klingt kompliziert :(hoffte wirklich, in ASP.NET und C# –

+1

bleiben Es ist machbar in ASP.NET und C# - fügen Sie einfach ein wenig JS zum Mix. – Filburt

Antwort

2

Sie müssen verstehen, dass eine Web-Seite von einem Desktop-Client-Anwendung grundsätzlich verschieden ist, wo Sie können DoEvents und Repaint wann immer Sie brauchen. ASP.NET wird serverseitig ausgeführt und führt somit einen vollständigen Umlauf zwischen dem Senden einer Seite und dem Verarbeiten von Ereignissen auf dem Server durch.

Wenn Sie eine lange laufende Aufgabe starten und Fortschrittsinformationen abrufen möchten, müssen Sie AJAX verwenden.

Siehe Introduction to the UpdateProgress Control für ein älteres Konzept

oder

track the progress of a database save in a “live” progress bar asp.net mvc für einen modernen Ansatz

... Sie werden die Wahl für Ihr spezielles Szenario machen.

Verwandte Themen