【发布时间】:2021-08-11 08:19:38
【问题描述】:
应该怎么做才能在CListCtrlEx 中填充数据后自动选择其中的一行。
目的是在显示CListCtrlEx 时选择默认行。例如,如果显示的数据是城市列表,则显示其中一个城市(可能是之前选择的城市),下次显示控件时默认选中。
【问题讨论】:
标签: c++ user-interface mfc dialog clistctrl
应该怎么做才能在CListCtrlEx 中填充数据后自动选择其中的一行。
目的是在显示CListCtrlEx 时选择默认行。例如,如果显示的数据是城市列表,则显示其中一个城市(可能是之前选择的城市),下次显示控件时默认选中。
【问题讨论】:
标签: c++ user-interface mfc dialog clistctrl
假设m_MyList 是对话框的一部分,我们将以下行添加到OnInitDialog() 并希望选择第一行:
m_MyList.SendMessage(LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);
m_MyList.SetItemState(0, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED);
m_MyList.SetFocus();
return FALSE; // return TRUE unless you set the focus to a control
别忘了更改默认值
return TRUE;
到
return FALSE;
【讨论】:
SetFocus的原因是什么?选择行不需要。如果您出于某种原因确实想设置焦点,请使用how to set focus in a dialog box。另外,ListView_SetItemState no-op 是怎么回事?
CDialog::GotoDlgCtrl。
ListView_SetItemState(m_Mylist, nItem, LVIS_SELECTED, LVIS_SELECTED); 参见:this link - 是的。没必要,我删了。
ModifyStyleEx 更新扩展窗口样式。要设置extended list-view style,您必须发送LVM_SETEXTENDEDLISTVIEWSTYLE 消息。也就是说,我不知道 OP 试图完成的什么。要让列表视图的选择标记始终可见,您通常会使用 LVS_SHOWSELALWAYS list-view style。
m_MyList.SetExtendStyle(m_MyList.GetExtendStyle() | LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);