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

时间:2013-09-15 11:30:34

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

我发现所有互联网资源都声称,在WinForms中,实现这一目标的唯一可能性就是创建自己的UserControl(示例:herehere,{ {3}},here)。

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

1 个答案:

答案 0 :(得分:5)

是的,有可能:

  • 为列表中的每件商品创建ImageList并为其添加Bitmap
  • 创建ListView并将上面创建的ImageList附加为SmallImageList
  • ListView样式设置为Details
  • 根据需要添加尽可能多的列 - 第一列必须包含图片
  • 为每列添加适当字符串的后续ListViewItem,并引用适当的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 */
  }
//...
}
  • 刷新ProgressBar

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

其中progressBarBitmap是适当index progressBarImageListprogressBar的适当位置(ListViewItem)的图片(每个ProgressBar都拥有ImageList UserControl当然已经分配了。)

关键是要将同一张图片再次分配到BatchExperimentWindow中的同一位置 - 这会导致重新绘制,如果没有,则无效。

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

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

示例结果: enter image description here

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