如何更新标签中的文本

时间:2011-10-31 14:56:42

标签: c# asp.net visual-studio label

我这里有一个很长的方法,需要一段时间才能执行。我想让用户受理,所以我创建了一个进度条和一个标签。我希望在系统执行进度时更改标签。我一直在看Application.DoEvents(),但这似乎是错误的方法。这个应用程序非常简单,它只是一个项目,没有专业。所有这个应用程序都是将文件发送到客户端并将数据插入数据库。

我有一个标签(除了成功和错误标签),我希望不断更新进度条。有关如何执行此操作的任何想法或提示?在这种情况下,Application.DoEvents()是否可以接受?或者是否有一种更新文本的简单方法。我正在使用C#,asp.net和System.Web.UI.Page。任何帮助或指向我正确的方向将不胜感激。

protected void Button_Click(object sender, EventArgs e)
{
    PutFTPButton.Enabled = false;
    Thread.Sleep(3000);
    Button btn = (Button)sender;
    KaplanFTP.BatchFiles bf = new KaplanFTP.BatchFiles();
    KaplanFTP.Transmit transmit = new KaplanFTP.Transmit();
    //label text change here
    if (btn.ID == PutFTPButton.ID)
    {
        //bf.ReadyFilesForTransmission();
        DirectoryInfo dir = new DirectoryInfo(@"C:\Kaplan");

        FileInfo[] BatchFiles = bf.GetBatchFiles(dir);

        bool result = transmit.UploadBatchFilesToFTP(BatchFiles);
        //label text change here
        if (!result)
        {
            ErrorLabel.Text += KaplanFTP.errorMsg;
            return;
        }

        bf.InsertBatchDataIntoDatabase("CTL");
        bf.InsertBatchDataIntoDatabase("HDR");
        bf.InsertBatchDataIntoDatabase("DET");
        bf.InsertBatchDataIntoDatabase("NTS");
        List<FileInfo> allfiles = BatchFiles.ToList<FileInfo>();
        allfiles.AddRange(dir.GetFiles("*.txt"));
        bf.MoveFiles(allfiles);
        //label text change here
        foreach (string order in bf.OrdersSent)
        {
            OrdersSentDiv.Controls.Add(new LiteralControl(order + "<br />"));
        }
        //lblWait.Visible = false;
        OrdersSentDiv.Visible = true;
        OrdersInfoDiv.Visible = false;
        SuccessLabel.Visible = true;
        NoBatchesToProcessLbl.Visible = true;
        BatchesToProcessLbl.Visible = false;
        PutFTPButton.Enabled = false;
        BatchesCreatedLbl.Text = int.Parse(NextBatchNum).ToString();
        Thread.Sleep(20000);

        if (KaplanFTP.errorMsg.Length != 0)
        {
            ErrorLabel.Visible = true;
            SuccessLabel.Visible = false;
            ErrorLabel.Text = KaplanFTP.errorMsg;
        }
    }
}

3 个答案:

答案 0 :(得分:3)

我认为您可以使用Ajax UpdateProgress控件,请检查Progress Bar on File Upload ASP.NET

编辑:另一个Displaying Progress Bar For Long Running Processes using ASP.NET AJAX

答案 1 :(得分:1)

    delegate void SetTextCallback(string text);

    private void SetText(string text)
    {
        if (this.label1.InvokeRequired)
        {
            SetTextCallback d = new SetTextCallback(SetText);
            this.Invoke(d, new object[] { text });
        }
        else this.label1.Text = text;
    } 
    void SomeMethod()
    {
        SetText(yourVariable.ToString());
    }

如果我理解正确,这应该有用。

答案 2 :(得分:0)

Application.DoEvents()在ASP.NET应用程序中不可用,随着多核处理器和.NET线程库的出现,它在标准的WinForms应用程序中也是不可接受的。

Web应用程序需要与服务器进行通信。因此,只需更新标签文本即可,除非您将其发送回客户端。在您的情况下,您需要一个由此行发出信号的事件(因为它是批量上传):

transmit.UploadBatchFilesToFTP(BatchFiles); 

该事件将更新您要显示的值。然后,您需要在相关网页上使用一些AJAX代码(或围绕ASP.NET标签的ASP.NET更新面板)来获取并显示新值。

HTH