【问题标题】:C#: progress change event in foreach loop no idea how to show progress with progressbarC#:foreach 循环中的进度更改事件不知道如何使用进度条显示进度
【发布时间】:2016-11-06 15:22:43
【问题描述】:

目前我正在 C# 中创建一个视频下载器,因为我允许用户一次选择多个视频进行下载,并且选定的视频会转到列表视图控件。我想显示每次下载的进度。这是我开始下载的代码:

 listView1.Invoke(new MethodInvoker(delegate ()
            {
                foreach (ListViewItem item in listView1.SelectedItems)
                {
                    try
                    {
                        listViewItems = listView1.Items.Count;
                        string path = Properties.Settings.Default.outputFolder;
                        IEnumerable<VideoInfo> videos = DownloadUrlResolver.GetDownloadUrls(item.Text);
                        VideoInfo video = videos.First(p => p.VideoType == VideoType.Mp4);
                        if (video.RequiresDecryption)
                            DownloadUrlResolver.DecryptDownloadUrl(video);
                        title = video.Title;
                        foreach (char c in invalid)
                        {
                            title = title.Replace(c.ToString(), "");
                        }
                        VideoDownloader downloader = new VideoDownloader(video, Path.Combine(path + "\\", title + video.VideoExtension));
                        downloader.DownloadProgressChanged += Downloader_DownloadProgressChanged;
                        downloader.DownloadFinished += Downloader_DownloadFinished;
                        Thread thread = new Thread(() =>
                        {
                            downloader.Execute();
                        })
                        { IsBackground = true };

                        thread.Start();
                    }
                    catch (Exception web)
                    {
                        DialogResult dlg = new DialogResult();
                        messageBox msb = new messageBox();
                        msb.labelText = "Video no longer available";
                        msb.btnText = "Ok";
                        dlg = msb.ShowDialog();
                        if(dlg == DialogResult.OK)
                        {
                            msb.Close();
                        }
                 }
                }

这是进度变化事件:

private void Downloader_DownloadProgressChanged(object sender, ProgressEventArgs e)
    {
        flowLayoutPanel1.Invoke(new MethodInvoker(delegate
        {
            ProgressBar pb = new ProgressBar();
            pb.Value = (int)e.ProgressPercentage;
            flowLayoutPanel1.Controls.Add(pb);
        }));

    }

不是为每个项目创建进度条,而是创建很多进度条,这些进度条也没有显示任何进度。

我是 C# 新手,所以需要这方面的帮助。

【问题讨论】:

    标签: c# foreach progress-bar progress


    【解决方案1】:

    如果不亲自运行它,我发现代码有点难以理解,但我建议将您的问题分成两部分。首先,确保 DownloadProgressChanged 事件正常工作,这意味着它会在每次进度更改时触发,并且 e.ProgressPercentage 实际上确实有一个值。而且您不应该在每次 DownloadProgressChanged 触发时都添加新的进度条。其次,获取一些简单的 ProgressBar 代码来工作,而无需担心整个项目列表甚至下载视频。

    将问题分解为可管理的部分,然后从那里开始构建。

    【讨论】:

    • 感谢您的回复,是的,DownloadProgressChanged 事件每次都会触发,并且 e.progressPercentage 的值就像我只使用一个已定义的进度条一样,它显示多个进度结果正在闪烁进度条。
    【解决方案2】:

    每次事件发生时,您都会创建一个进度条。您需要在流程开始之前创建一个,并且只在事件中更新它的值。 sp ProgressBar pb = new ProgressBar();flowLayoutPanel1.Controls.Add(pb); 不属于该事件。

    更新

    我现在看到您想为每次下载添加一个进度条。

    您必须将添加进度条的 2 行移动到主 for 循环,然后将每个条的引用添加到每个下载器。所以基本上你在下载开始之前每次下载添加一个进度条,然后在更新时你引用自己的下载器的进度条并更新它。

    VideoDownloader downloader = new VideoDownloader(video, Path.Combine(path + "\\", title + video.VideoExtension));
    downloader.DownloadProgressChanged += Downloader_DownloadProgressChanged;
    downloader.DownloadFinished += Downloader_DownloadFinished;
    ProgressBar pb = new ProgressBar(); //new
    flowLayoutPanel1.Controls.Add(pb); //new
    downloader.ProgressBar = pb;       //new - you will need to add a property to the downloader class
    

    然后在您的情况下,您将修改下载器进度条值:

    private void Downloader_DownloadProgressChanged(object sender, ProgressEventArgs e)
        {
            flowLayoutPanel1.Invoke(new MethodInvoker(delegate
            {
                this.ProgressBar.Value = (int)e.ProgressPercentage; 
            }));
    
        }
    

    【讨论】:

    • 感谢回复 我试过了,但是进度条会闪烁,因为它同时显示所有下载的进度。
    • 感谢您到目前为止所做的一切,因为我是 c# 的新手,还有一个问题,当我尝试添加字符串时,我应该将哪种类型的属性添加到下载器类,int 但它给出了错误,你是将 System.Windows.Forms.ProgressBar 分配给 int。需要帮助,请再次感谢。
    • 它必须是 ProgressBar 类型。您想将进度条对象分配给它。
    • 好的先生,我用标签试过了,因为我可以为文本设置属性。但是当我想用这个关键字在 downloadProgressChanged 中访问它时,它表明 ProgressBar 没有在这个程序中定义,如果我通过 pb.text = e.progressPercentage.ToString();它显示第一个为 0.435%,然后卡住,然后显示第二个标签 0.456%,如果你理解,这个标签会随着进度条不断闪烁,请帮助我,我非常感谢你到目前为止所做的一切(Y)
    • 好的,先生,我创建了progressbar 属性,并按照您所说的做,它正在创建确切的数字或progressbars 作为列表中的项目数,但进度只显示在最后一个progressbar 中并且也会闪烁。感谢您迄今为止的帮助(Y)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多