1

私が見つけたすべてのインターネット ソースはWinForms、これを達成する唯一の可能性は独自のものを作成することであると主張していますUserControl(例: hereherehereおよび here )。

WinForms提供されたコントロールのみを使用してこれを達成することは可能ですか?

4

1 に答える 1

6

はい、可能です:

  • を作成し、リスト内の各項目に対して を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)の画像です (もちろん、それぞれに独自の割り当てがあります)。progressBarImageListprogressBarListViewItemProgressBar

重要なことは、同じ画像を同じ場所に再度割り当てることです。ImageListこれにより、再描画が発生し、これがないと機能しません。

長所: 迅速 (独自に を作成する必要がないUserControl)、安価 (これについて調べるために多くの調査が行われましたが、最終的に記述するコードはあまり多くありません)、動作します。

短所: 多数のアイテムがある場合、ちらつきがあることに気付きました。また、モノにはいくつかのさわやかな問題があります。

結果の例: ここに画像の説明を入力

サンプル アプリケーションのコード: https://github.com/bartoszkp/dotrl (BSD ライセンス) - 特にBatchExperimentWindowクラスを参照してください: https://github.com/bartoszkp/dotrl/blob/master/Application/BatchExperimentWindow.cs

于 2013-09-15T11:30:34.157 に答える