私が見つけたすべてのインターネット ソースはWinForms
、これを達成する唯一の可能性は独自のものを作成することであると主張していますUserControl
(例: here、here、here、および here )。
WinForms
提供されたコントロールのみを使用してこれを達成することは可能ですか?
はい、可能です:
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
)の画像です (もちろん、それぞれに独自の割り当てがあります)。progressBarImageList
progressBar
ListViewItem
ProgressBar
重要なことは、同じ画像を同じ場所に再度割り当てることです。ImageList
これにより、再描画が発生し、これがないと機能しません。
長所: 迅速 (独自に を作成する必要がないUserControl
)、安価 (これについて調べるために多くの調査が行われましたが、最終的に記述するコードはあまり多くありません)、動作します。
短所: 多数のアイテムがある場合、ちらつきがあることに気付きました。また、モノにはいくつかのさわやかな問題があります。
サンプル アプリケーションのコード: https://github.com/bartoszkp/dotrl (BSD ライセンス) - 特にBatchExperimentWindow
クラスを参照してください: https://github.com/bartoszkp/dotrl/blob/master/Application/BatchExperimentWindow.cs