リストコントロールで選択行の値を取得しても古い値が取得されてしまう – プログラミング – Home

リストコントロールで選択行の値を取得し...
 
通知
すべてクリア

[解決済] リストコントロールで選択行の値を取得しても古い値が取得されてしまう


shang
 shang
(@shang)
ゲスト
結合: 17年前
投稿: 23
Topic starter  

2005VC++ MFCです。

縦可変、横3マスのリストコントロールにおいて、
選択した行の値を取得表示させたいのですが、下記コードにおいて
取得される値が正確だったり一つ前に選択した行の値だったりします。
また、選択してもこの関数が呼ばれず表示されない場合と1回のクリックでこの関数が2
回呼ばれる事もあります。
使い方が間違っているのでしょうか?

ちなみに一回の選択で行全部が選択されるようLVS_EX_FULLROWSELECTを設定していま
す。

void CHDlg::OnLvnItemchangedListSearchResult(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);

CString str;
int index = -1;

while ((index = m_cList_Alarm.GetNextItem(index, LVNI_ALL |
LVNI_SELECTED)) != -1)
{
str = _T(1:) +m_cList_Alarm.GetItemText(index, 0);
str += _T(2:) +m_cList_Alarm.GetItemText(index, 1);
str += _T(3:) +m_cList_Alarm.GetItemText(index, 2);
MessageBox(str);
}
}


引用未解決
トピックタグ
onicuka
 onicuka
(@onicuka)
ゲスト
結合: 17年前
投稿: 1
 

以下のように処理したらご希望の動作でしょうか?

void CHDlg::OnLvnItemchangedListSearchResult(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);

CString str;
int index = -1;

   if((pNMLV->uChanged & LVIF_STATE) &&
(pNMLV->uNewState & LVIS_SELECTED)) {
str = _T(1:) +m_cList_Alarm.GetItemText(pNMLV->iItem, 0);
str += _T(2:) +m_cList_Alarm.GetItemText(pNMLV->iItem, 1);
       str += _T(3:) +m_cList_Alarm.GetItemText(pNMLV->iItem, 2);
str += \r\n;
OutputDebugString(str);
}
}


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

LVN_ITEMCHANGEDはアイテムの状態が変化した時に送られてくるメッセージのようですから
メッセージが来たからといってなんでも処理してしまってはだめだと言うことなんでしょ
うね。
この辺はメッセージがどういう時に送られてくるのかをしっかり抑えておく必要があると
思います。


返信引用
shang
 shang
(@shang)
ゲスト
結合: 17年前
投稿: 23
Topic starter  

教えて頂いた様にコードを変更してうまく行きました!

LVN_ITEMCHANGEDについても教えていただきありがとうございます。
てっきりクリックした時に1回だけ呼ばれるものだと思っていたので、、

助かりました。
またインデックスの取得方法についてもpNMLV->iItemで良かったんですね。

ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました