- PR -

LitViewにProggressBarを表示する

1
投稿者投稿内容
たく
会議室デビュー日: 2007/06/15
投稿数: 16
投稿日時: 2007-06-16 15:31
こんにちは。よろしくお願いします。


リストビュー内の2カラム目に
 ・進捗率
 ・プログレスバー
を表示し、プログレスバーの進捗は、backgroundworkerを用いて操作する予定です。

以下のやり方で、リストビュー内にプログレスバーを表示することはできました。
(下のままでは、初期表示サイズがおかしいですが。。。)

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

ProgressBar prg = new ProgressBar();
listView1.Controls.Add(prg);

ListViewItem item = new ListViewItem();

item.Text = "○○";
item.SubItems.Add("0%");
item.SubItems.Add("2007年6月16日");

int x = 0;
listView1.ColumnWidthChanged
  += delegate(object sender, ColumnWidthChangedEventArgs e)
{
  x = listView1.Columns[0].Width +
     listView1.Columns[1].Width - 50;
prg.Location = new Point(x, prg.Location.Y);
prg.Width = this.listView1.Columns[2].Width-100;
};

prg.Bounds = listView1.Items[index].Bounds;
x = listView1.Columns[0].Width +
   listView1.Columns[1].Width - 50;
prg.Location = new Point(x, prg.Location.Y);
prg.Height--;

↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

上記ColumnWidthChangedをデリゲートすることで、動的にプログレスバーの幅を変えることはできるのですが、カラム幅のスプリッタ移動中に上記イベントが走らないので、スプリッタ移動中は、実際に表示したいカラム位置にプログレスバーが表示されなくなってしまいます。。。。。

このような症状がでないように小細工することは可能でしょうか?
(この方法でリストビューにプログレスバーを表示する場合は、仕方ない?)

また、みなさまはリストビューにプログレスバーを表示する場合、どのような手段を用いるのでしょうか?
上記手段でなくても、できるだけシンプルに処理できればいいなと考えています。



環境は以下です。
 ○WindowsXP SP2
 ○VS 2005 C#
たく
会議室デビュー日: 2007/06/15
投稿数: 16
投稿日時: 2007-06-16 15:57
自己レスですいません。

デリゲートに登録するイベントを間違えていることに気付きました。


listView1.ColumnWidthChanged
  += delegate(object sender, ColumnWidthChangedEventArgs e)

   ↓

listView1.ColumnWidthChanging
  += delegate(object sender, ColumnWidthChangingEventArgs e)



とすることで、とりあえず期待どおりの動きはするようになりました。
FrameWork2.0で開発する場合、リストビューにプログレスバーを表示する一番楽な方法は、この方法になるのでしょうか?
たく
会議室デビュー日: 2007/06/15
投稿数: 16
投稿日時: 2007-06-16 17:28
度々の投稿申し訳ありません。

上記方法だと、
 ・スクロールバーによる表示内容変更
 ・マウス中央ボタンを動かすことでの表示内容変更
に対応できていませんでした。

そこで、ネットで調べたところ、ユーザコントロールを作って、WndProcをオーバーライドすることでイベントは取れることはわかりました。

以下、LsitViewを継承したユーザコントロール内の記述
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
protected override void WndProc(ref Message m)
{
  const int WM_HSCROLL = 0x114;
  const int WM_VSCROLL = 0x115;
  const int WM_MBUTTONDOWN = 0x207;

  switch (m.Msg)
  {
    case WM_MBUTTONDOWN:
    case WM_HSCROLL:
    case WM_VSCROLL:
      ???????
      break;
  }
  base.WndProc(ref m);
}
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

そこで、上記ソース内の「???????」で、カラムサイズ変更イベント(ColumnWidthChanged )を発生させて、描画に対応しようと思ったのですが、そのやり方がわかりません、、、
どのようにすれば、カラムサイズ変更イベントを発生させることができるのでしょうか?


#というか、表示位置の補正方法は上記で問題ないでしょうか?
#ここで補正しても、スクロール前の画面に対し、補正している??
1

スキルアップ/キャリアアップ(JOB@IT)