在winform中将行添加到datagrid时,Marquee样式进度条会冻结

时间:2014-01-17 00:32:09

标签: c# .net winforms datagridview progress-bar

我正在使用BackgroundWorker做一些工作,并使用选框样式进度条在屏幕上显示其进度。我在ProgressChanged事件中更新进度条,同时在datagridview中添加一行。 datagridview具有AllowUserToAddRows = false。显然,这种组合似乎冻结了选框样式进度条。如果我使用style = blocks progressbar,一切正常。我在Windows 7上使用带有Aero主题的.NET 4.5。 我的问题是

  1. 这是一个错误吗?
  2. 在我的约束中是否有解决方法
  3. 以下是演示此问题的示例代码。在Windows窗体上添加BackgroundWorker,2个ProgressBars和一个按钮。

    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();
            progressBar2.Style = ProgressBarStyle.Marquee;
            dataGridView1.AllowUserToAddRows = false;
        }
    
        private void button1_Click(object sender, EventArgs e) {
            progressBar1.Value = 0;
            progressBar1.Visible = true;
            progressBar2.Visible = true;
            backgroundWorker1.RunWorkerAsync();
        }
    
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) {
            var di = new DirectoryInfo(@"D:\BackedupFolder\Photos");
            FileInfo[] files1 = di.GetFiles("*.jpg", SearchOption.AllDirectories);
    
            int tot = files1.Length, i = 0;
            foreach (var q in files1) {
                CheckSum(q);
                backgroundWorker1.ReportProgress(++i * 100 / tot);
            }
        }
    
        byte[] CheckSum(FileInfo f) {
            MD5 hashAlgo = MD5.Create();
            return hashAlgo.ComputeHash(f.OpenRead());
        }
    
        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) {
            progressBar2.Update();
            progressBar1.Value = e.ProgressPercentage > 100 ? 100 : e.ProgressPercentage;
            dataGridView1.RowCount++;
        }
    
        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
            progressBar1.Visible = false;
            progressBar2.Visible = false;
        }
    }
    

    编辑:

    1. 为了清楚起见,我需要在向datagridview添加新数据时使用进度条显示长任务(I / O和CPU密集型)的进度
    2. 如果用Thread.Sleep替换实际任务,则选框可以正常工作
    3. 编辑:

      我会保持这个问题的开放,所以希望有人知道为什么会这样。 DataGridView.AllowUserToAddRows影响选框样式非常有趣(包括样式中的选框动画=连续)ProgressBar

      与此同时,我能找到的唯一合理的解决方法是将我的ProgressBar移动到一个新的表单上,而不是显示停留在当前表单底部的进度条,而是显示带有条形和取消按钮的ProgressDialog 。

      编辑:

      1. 我的真实应用程序比这里显示的示例做了更复杂和耗时的处理(想象一下比较文件和校验和的LINQ连接)。该示例更加努力地将问题与实际代码隔离开来。
      2. 行progressBar2.Update()确实不需要,我只是把它放在那里表达我也尝试过。
      3. 在我的实际代码中,我使用了一个style = continuous的单一进度条,它是style = blocks和style = marquee之间的混合。在使用它时,我注意到选框没有更新,但阻止了进度,这是我在各种实验中对实际问题进行了零处理。
      4. 此外,在实际代码中,除了一些处理之外,我必须做的唯一GUI更新是在网格中添加一行。

0 个答案:

没有答案