如何在循环中更新文本框项或标签?

时间:2012-02-03 14:58:33

标签: c#

所以我在C#,vs2010中有一个桌面应用程序编程。它只有2个文本框和一个按钮,它的作用是,我想输入一个链接,在第一个框中下载一个直接的exe文件,当我提交它,在下载时,我如何制作第二个文本框显示一定比例的下载。

如果这太难以解释,请不要担心,我特别想要的是,例如,如果我正在进行某种循环,就像我有两个列表框,加载了相同的文本文件,我想循环通过它检查重复,但在循环中,像一个状态类型思考,例如它可能是说“检查”,或“扫描(密码在这里)”或“现在寻找(密码)...”等。

4 个答案:

答案 0 :(得分:1)

看一下BackgroundWorker课程。它将使您能够在单独的线程中运行下载过程,然后定期将进度报告回UI。

答案 1 :(得分:1)

您需要研究使用threading并运行异步进程。检查有关异步更新WinForms UI的this问题。此外,为了显示进度,您可能需要某种形式的进度条。 WinFormsWPF都有进度条控件,具体取决于您使用的是哪个。或者,请考虑使用Label或TextBlock而不是TextBox来显示百分比。

答案 2 :(得分:0)

这个问题实际上是两个问题。第一个是如何处理下载的报告进度。第二个是关于在不阻塞UI线程的情况下处理长时间运行操作的更一般的问题。

回答第1个问题:报告下载进度

我会使用WebClient的DownloadFileAsync方法。假设你的URL的TextBox名为FileURL,你有一个名为DownloadProgress的ProgressBar和一个名为StartDownload的按钮,一个非常基本的实现可能是这样的:

    private void StartDownload_Click(object sender, RoutedEventArgs e)
    {
        if (this.FileURL.Text.Trim() != "")
        {
            try
            {
                WebClient wc = new WebClient();
                wc.DownloadProgressChanged += new DownloadProgressChangedEventHandler(wc_DownloadProgressChanged);
                wc.DownloadFileCompleted += new AsyncCompletedEventHandler(wc_DownloadFileCompleted);
                //todo: handle mime-type and location to save to!
                wc.DownloadFileAsync(new Uri(this.FileURL.Text), "SomeFileName.ext");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }

    void wc_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
    {
        //Set the progress bar back to nothing
        if (MessageBox.Show("Download Completed!", "Finished!", MessageBoxButton.OK) == MessageBoxResult.OK)
        {
            this.DownloadProgress.Value = 0;
        }
    }

    void wc_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
    {
        //update the progress bar based on the percentage completed.
        this.DownloadProgress.Value = (double)e.ProgressPercentage;
    }

注意:您必须添加对System.Net的引用才能使用WebClient

回答第2个问题

我认为您正在寻找一个BackgroundWorker来处理循环中的进度。可以在MSDN上找到一个很好的起始示例。

然后,您将从BackgroundWorker报告进度并将其显示在表单上。

答案 3 :(得分:-1)

要访问文本框文本,您应该像这样:

myTextBox1.Text = "Scanning (whatever)";

然后您可以应用应用程序逻辑