如何在没有WPF的情况下将ProgressBar嵌入到ListView中?

Bar*_*zKP 1 .net c# listview winforms progress-bar

所有的网络资源,我发现声称,WinForms唯一的可能实现这一目标是创建你自己的UserControl(例子:这里,这里,这里,并在这里).

是否可以仅使用提供的WinForms控件实现此目的?

Bar*_*zKP 6

对的,这是可能的:

  • 为列表中的每个项目创建ImageList并添加一个Bitmap
  • 创建一个ListView并将ImageList上面创建的作为附件附加SmallImageList
  • 设置ListView样式Details
  • 根据需要添加尽可能多的列 - 第一列必须包含图片
  • ListViewItem为每列添加具有适当字符串的后续s,并在第一步中创建适当的ImageIndex引用Bitmap

 

//...
{
  foreach (/*item to add to list*/)
  {
    Bitmap progressBarBitmap = new Bitmap(
        this.imageList.ImageSize.Width,
        this.imageList.ImageSize.Height);
    this.imageList.Images.Add(progressBarBitmap);
    ProgressBar progressBar = new ProgressBar();
    progressBar.MinimumSize = this.imageList.ImageSize;
    progressBar.MaximumSize = this.imageList.ImageSize;
    progressBar.Size = this.imageList.ImageSize;

    // probably create also some BackgroundWorker here with information about
    // this particular progressBar

    ListViewItem lvi = new ListViewItem(
        new[] { "column1", ... },
        this.listView.Items.Count);

    lvi.UseItemStyleForSubItems = true;
    this.listView.Items.Add(lvi);
    lvi.Tag = /* some convenient info class to refer back to related objects */
  }
//...
}
Run Code Online (Sandbox Code Playgroud)
  • 刷新ProgressBar:

 

int previousProgress = progressBar.Value;
progressBar.Value = ...
if (progressBar.Value != previousProgress)
{
  progressBar.DrawToBitmap(progressBarBitmap, bounds);
  progressBarImageList.Images[index] = progressBarBitmap;
}
Run Code Online (Sandbox Code Playgroud)

progressBarBitmap适当的位置(index)的图像在哪里progressBarImageList适当progressBar(当然每个ListViewItem都有它自己ProgressBar分配).

关键是将同一图像再次分配到同一个地方ImageList- 这会导致重新绘制,如果没有这个,它就无法工作.

优点:快速(不必编写自己的UserControl),便宜(有很多调查要找出这个,但最终写的代码不多),并且有效

缺点:当有大量物品时,我注意到有些闪烁.此外,Mono还有一些令人耳目一新的问题.

示例结果: 在此输入图像描述

代码示例应用程序:https://github.com/bartoszkp/dotrl(BSD许可证) - 特别参见BatchExperimentWindow类:https://github.com/bartoszkp/dotrl/blob/master/Application/BatchExperimentWindow.cs