- PR -

ListViewの仮想モード

1
投稿者投稿内容
CSharp
会議室デビュー日: 2005/11/28
投稿数: 15
投稿日時: 2006-06-08 20:29
開発環境 VS2005.NET C#
ListViewを仮想モードで動作させています。
Ctrl+Aを押すとリスト中の項目を全て選択できるようにしたいのですが、
Selectedプロパティをtrueに設定しても未表示の項目が選択状態になりません。

何かご存じであればご教授下さい。
宜しくお願いいたします。

渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2006-06-09 11:16
引用:

Selectedプロパティをtrueに設定しても未表示の項目が選択状態になりません。



仮想モードの場合は、表示の項目の状態は自分で管理しなくちゃ駄目です。
面倒ですが。
CSharp
会議室デビュー日: 2005/11/28
投稿数: 15
投稿日時: 2006-06-13 11:22
返事が遅くなってしまい申し訳ございません。

データの状態の管理は自分で行っているのですが、表示はListViewに任せたいと思っています。
(表示されているデータは Selected プロパティを変更することで選択状態が変更出来るので、その処理を利用したいと。)
Ctrl+Aが押された時点で「表示したことにする」ような手立てがあれば、その方法でも構いません。
何かご存じな事がありましたら、ご教授下さい。
宜しくお願いします。

ちなみに OnRetrieveVirtualItem メソッドが呼び出されれば「表示したことになる」ようです。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2006-06-13 16:58
引用:

データの状態の管理は自分で行っているのですが、表示はListViewに任せたいと思っています。



仮想モードでは、ListView は「見えているアイテム」のことしか感知しないのですから、「見えてないアイテム」の状態は自分で管理するしかないんです。

引用:

Ctrl+Aが押された時点で「表示したことにする」ような手立てがあれば、その方法でも構いません。



「表示したこと」にする必要なんかないですよね?

単純に「Ctrl+A が押されたこと」を検知して、全アイテムの状態を変更すればいいだけだと思うんですが、それでは駄目なんでしょうか?



_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
CSharp
会議室デビュー日: 2005/11/28
投稿数: 15
投稿日時: 2006-06-13 17:41
回答ありがとうございます。

自分でCtrl+Aを押したときに、自分の管理下にある全アイテムを選択状態にしています。このときに表示したことのあるアイテムのみ選択状態に変更されます。
その後,スクロールすると未表示アイテムを表示するためにOnRetrieveVirtualItemメソッドが呼ばれますが,表示された結果が選択状態になっていません。

RetrieveVirtualItemEventArgs.Item に渡すListViewItem.Selected プロパティはtrueで渡しています。渋木宏明(ひどり)さんの言う「全アイテムの状態を変更」とは Selected プロパティを変更するという意味ではないのでしょうか?

度々すみませんが宜しくお願いします。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2006-06-13 21:53
引用:

その後,スクロールすると未表示アイテムを表示するためにOnRetrieveVirtualItemメソッドが呼ばれますが,表示された結果が選択状態になっていません。



お。それはおかしいですね。

引用:

RetrieveVirtualItemEventArgs.Item に渡すListViewItem.Selected プロパティはtrueで渡しています。渋木宏明(ひどり)さんの言う「全アイテムの状態を変更」とは Selected プロパティを変更するという意味ではないのでしょうか?



そういう意味です。

それが実際の挙動だとすると、間に合わせの手段になってしまいますが、全アイテムの状態変更を行った後に ListView.Refresh() などで ListView に再描画を促せばいいのではないでしょうか?
CSharp
会議室デビュー日: 2005/11/28
投稿数: 15
投稿日時: 2006-06-14 13:01
ありがとうございます。解決しました!

選択状態にならなかった原因は SelectedIndices プロパティを自分で管理していなかったことにありました。
(一度でも表示すると、後は ListView が管理してくれるので、自分では何もしなくても良いものと思っていました。初めから「全て」自分で管理する必要があるとの助言を戴きながら面目ないです)
そのため、初回表示時にOnRetrieveVirtualItem メソッドで RetrieveVirtualItemEventArgs.Item.Selected プロパティに true を設定しても、ListView が SelectedIndices プロパティの状態を見て false に変更してしまい、未選択状態で表示されていたようです。
ListViewItem.Index が -1 の時は SelectedIndices を自分で管理するようにすると全て問題なく動作しました。

渋木宏明(ひどり)さんのお力添えがなければ、どんどん間違った方向に進むところでした。
本当にありがとうございました。
1

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