【先着1,000名様!】1,000円分をプレゼント!

お世話になります。
仮想リストビューで画像一覧を表示しているのですが、アイテムの選択状態を上手く取得できず困っています。

通常はItems.SelectedImtesで取れるのですが、仮想リストビューだと例外になってしまいます。

そこでOnItemSelectionChangedで取得しようとしたのですが、何故か選択解除のタイミングでイベントが発生しません。仮想リストビューだからなのでしょうか。

とりあえず今はOnDrawItemで取得して変数に保存していますが、今度はスクロールで隠れた画像の選択解除が取得できません。
ですのでOnItemSelectionChangedでShiftキーとCtrlキーの有無を見て、押されていなければ一度全てのアイテムが選択解除されたものとし、その後Invalidate()とUpdate()でOnDrawItemを呼び出しています。
OnDrawItemで現在表示中の場所(クリックしたアイテム。この時は1つだけのはず)の選択状態が取れるので、とりあえずこれで目的の動作は果たしました。

ですがやり方がスマートでない上に、アイテムをクリックする度に画面を更新しているので見た目が悪いです。

何か良い方法は無いでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (1件)

仮想モードの場合


ListViewItemCollectionとSelectedIndexCollection型の変数を用意してこれを使ってアクセスするように思います

ListView.ListViewItemCollection myCol;
ListView.SelectedIndexCollection mySel;
Form_Loadなどのイベントで
myCol = new ListView.ListViewItemCollection( listView1 );
mySel = new ListView.SelectedIndexCollection( listView1 );
などと紐付けします

OnItemSelectionChangeで
if (mySel.Count > 0 ) {
  ListViewItem oItem = myCol[ mySel[0] ];
}
などといった具合にアクセスすればいいようです
    • good
    • 0
この回答へのお礼

ありがとうございました。
おかげさまで思った通りの動作になりました。

お礼日時:2008/04/17 03:57

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q仮想リストコントロールの表示

お世話になります、fujitomoです。
今回ご意見を頂きたいと思い、質問させて頂きましたのはVCでの仮想リストコントロールにデータを表示する件に関してです。
具体的に申し上げますと、
あるデータが記述されたcsvファイルがあり、そのcsvファイルのある位置から200件のデータを仮想リストコントロールに表示させたいと思っています。
そこで、私が考えたアプリケーションの作りとして、初めにcsvファイルからデータを読み込んでCStringの二次元配列に各セルのデータを保存します。
そしてLVN_GETDISPINFOを受ける関数を作成し、そこでリストコントロールにCStringの二次元配列の値を当てはめていこうと思っています。つまり、関数内でリストの項目とCStringの二次元配列を1対1に対応させています。

しかしここで、LVN_GETDISPINFOを受ける関数は常にCStringの二次元配列の1行目から見てしまい、例えば、リストコントロールに100行目からのデータを表示させたいと思い、LVN_GETDISPINFOを受ける関数内でリストコントロールに表示させる開始行を指定したとしても0~99行目までが空白となって表示されてしまいます。目的の動作としては100行目からの200行をリストに表示させたいと思っているのでこれではダメです。

仮想リストコントロールを使うのは初めてで、どのように使うのが定石なのか分からない為悩んでいるのですが、私の目的の動作を達成させるためには表示させたい200行分のデータをその都度CStringの二次元配列に格納し、その配列とリストの項目をLVN_GETDISOINFOを受ける関数内で対応させるべきなのでしょうか?

文章だけではかなり分かりづらいと思うので、大雑把にですがソースを載せます。

//メンバ変数
CString data[gyo][row] //データを保存するCString二次元配列
CListCtrl m_list; //リストコントロールのコントロール変数
int start; //リスト表示行
//ダイアログの初めに
BOOL C***Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
Read_File(); //csvファイルをCStringの二次元配列に保存
m_list.SetItem(200);//200件表示に設定
return TRUE;
}
LRESULT C***Dlg::DefWindowProc(UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
case WM_NOFITY:
return OnGetListInfo(lParam);
}
return CDialog::DefWindowProc;
}
LRESULT C***Dlg::OnGetListInfo(LPARAM lParam)
{
LPNMHDR lpnmh = (LPNMHDR)lParam;
CWnd* hwndListView = GetDlgItem(IDC_LIST1);
LV_DISPINFO* lpDInfo;

switch(lpnmh->code){
case LVN_GETDISPINFO:
lpDInfo = (LV_DISPINFO*)lParam;
if(lpDInfo->iItem.mask & LVIF_TEXT){
if(lpDInfo->item.iItem >= start){
    switch(lpDInfo->item.iSubItem){
case 0:
_tcscpy_s(lpDInfo->item.pszText,256,
data[lpDinfo->item.iItem][lpDinfo->item.iSubItem];
break;
}
}
}
break;
}
return 0;
}
といったソースとなっています。
ご意見を宜しくお願い致します。

尚、開発環境は
Windows CE 6.0
Visual Studio 2005
です。
ご回答をお待ちしております。

お世話になります、fujitomoです。
今回ご意見を頂きたいと思い、質問させて頂きましたのはVCでの仮想リストコントロールにデータを表示する件に関してです。
具体的に申し上げますと、
あるデータが記述されたcsvファイルがあり、そのcsvファイルのある位置から200件のデータを仮想リストコントロールに表示させたいと思っています。
そこで、私が考えたアプリケーションの作りとして、初めにcsvファイルからデータを読み込んでCStringの二次元配列に各セルのデータを保存します。
そしてLVN_GETDISPINFOを...続きを読む

Aベストアンサー

定石というのであれば、"m_list.SetItem(gyo);"とするのが定石だと思いますが、"200件を固定で表示する"というのが仕様なのであれば、別に定石にこだわらなくても、
m_start_line = 200; // cvs表示開始セット
_tcscpy_s(lpDInfo->item.pszText,256,
data[m_start_line+lpDinfo->item.iItem][lpDinfo->item.iSubItem];
などとして、コピー開始位置にゲタをはかせてやれば問題は解決すると思いますが、どうでしょう?


人気Q&Aランキング