我正在使用BackgroundWorker做一些工作,并使用选框样式进度条在屏幕上显示其进度。我在ProgressChanged事件中更新进度条,同时在datagridview中添加一行。 datagridview具有AllowUserToAddRows = false。显然,这种组合似乎冻结了选框样式进度条。如果我使用style = blocks progressbar,一切正常。我在Windows 7上使用带有Aero主题的.NET 4.5。 我的问题是
以下是演示此问题的示例代码。在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;
}
}
编辑:
编辑:
我会保持这个问题的开放,所以希望有人知道为什么会这样。 DataGridView.AllowUserToAddRows影响选框样式非常有趣(包括样式中的选框动画=连续)ProgressBar
与此同时,我能找到的唯一合理的解决方法是将我的ProgressBar移动到一个新的表单上,而不是显示停留在当前表单底部的进度条,而是显示带有条形和取消按钮的ProgressDialog 。
编辑: