如何更新标签中的文本

3
我这里有一个执行时间较长的方法,我想要让用户在等待时保持娱乐性,所以我创建了一个进度条和一个标签。我希望在系统执行进度时标签内容也能实时更新。我一直在研究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个回答

3

有趣。我还没有尝试将标签放在进度控件内部。目前只有GIF动画。即使标签在ajax控件中,程序是否能够读取它们? - javasocute
可以的,但据我所知,您不需要任何标签,这就是UpdateProgress的重点,您可以使用一个图像(asp:Image是我使用的)来显示上传或其他您希望显示的内容。请检查我在答案中添加的新链接。 - Bastardo

0
    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());
    }

如果我理解你的意思正确,这应该可以工作。


我对C#还不是很熟悉,您能否解释一下这段代码的作用和原理? - javasocute
好的,我以为你在处理 WinForm。这个在 ASP.NET 上行不通。 - dum

0

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

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

transmit.UploadBatchFilesToFTP(BatchFiles); 

该事件将更新您想要显示的值。然后,您需要在相关网页上编写一些AJAX代码(或者在ASP.NET标签周围添加一个ASP.NET更新面板),以获取并显示新值。
希望对您有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接