Mfc 如何特别防止或锁定列表控件(报表视图)中的行选择
你好 我创建列表控制报告视图的目的是生成一个数据列表,当然用户可以选择他们想要的数据。所以我的问题是显示的第一个项目应该是一个参考(或)只读目的。这意味着我不希望用户选择它。我在网上到处搜索,我几个月的编程背景真的很难理解。我使用下面的方法生成数据列表Mfc 如何特别防止或锁定列表控件(报表视图)中的行选择,mfc,row,listcontrol,Mfc,Row,Listcontrol,你好 我创建列表控制报告视图的目的是生成一个数据列表,当然用户可以选择他们想要的数据。所以我的问题是显示的第一个项目应该是一个参考(或)只读目的。这意味着我不希望用户选择它。我在网上到处搜索,我几个月的编程背景真的很难理解。我使用下面的方法生成数据列表 lvItem.mask = LVIF_TEXT; lvItem.iItem = cnt; lvItem.iSubItem = 0; lvItem.pszText = data1; nItem = m_Lis
lvItem.mask = LVIF_TEXT;
lvItem.iItem = cnt;
lvItem.iSubItem = 0;
lvItem.pszText = data1;
nItem = m_List.InsertItem(&lvItem);
m_List.SetItemText(nItem, 1, data2);
m_List.SetItemText(nItem, 2, data3);
m_List.SetItemText(nItem, 3, data4);
m_List.SetItemText(nItem, 4, data5);
m_List.SetExtendedStyle(m_List.GetExtendedStyle()
|LVS_EX_FULLROWSELECT);
带着我孩子气的想法,我希望有一个我可以添加的函数,比如“lvitem.ROWSELECTLock=TRUE”,但当然这个MFC不提供它
*旁白:对于像我这样的初学者,MFC书有什么推荐吗
提前感谢您的回复
/凯文找到了
如果要派生自己的类或使用CListView
在堆栈溢出方面已经存在另一个问题,您可以在其中收集禁用选择所需的信息。
因此,要“阻止”仅对第一个项目的选择,您只需在“如果”中添加一个条件,检查“更改”项目是否是您想要的项目,在您的情况下是第一个项目(索引从0开始)
如果您希望在对话框中执行此操作,而不必派生自己的类
开始消息映射(CMyDialog,CDialog)
ON_NOTIFY(LVN_项目更改、IDC_列表1和CMyDialog::OnItemchangingList)
结束消息映射()
无效CMyDialog::OnItemchangingList(NMHDR*pNMHDR、LRESULT*pResult)
{
//LVN_项目更改通知处理程序
LPNMLISTVIEW pNMLV=重新解释铸件(pNMHDR)
}
有一种方法可以“阻止”选择,但是,这真的是您需要的吗?如果您不希望用户选择它,那么该项目是否应该在列表框中?这些信息不应该放在其他地方,比如标签或标题中吗?是的,我知道你的观点来自哪里。如果我找不到阻止用户点击它的方法。我就如你所说的,在另一个地方。我之所以将它们放在一起,是因为它们共享我从LVCOLUMN生成的相同列信息。对不起,我解释得不好,我希望你能理解。我明白了。但我还是认为你应该把这些信息放在一个单独的区域,用户肯定会点击它,并会问自己:“为什么我不能点击这个?”,因此,除非有其他原因,在我看来,你应该把它从“主列表框”中删除,放到其他地方。不管怎样,我自己也在尝试,因为这是一个有趣的练习=)不管怎样,你是使用CListView还是CDialog作为你的CListControl的父级?嗨@Robson,我的程序上只有一个列表视图,所以我想CListView是我的主视图。是的,我昨天看到了这个。这对我来说太难了,我无法理解如何从我自己的课堂上推导出来。但我决定试试看!好的,我刚刚找到了一种不推导它的方法,我将更新answer@KevinYong只需阅读您对CListView的其他评论,因为它只是封装了CListrCtrl,您可以使用“ON\u NOTIFY\u REFLECT(LVN\u ITEMCHANGING)”无论如何,很抱歉迟到了,谢谢你的回复。1.我在输入消息映射的条目时遇到问题。我必须删除字符“&”,否则在编译时会收到错误。2.同样的情况发生在“LPNMLISTVIEW”pNMLV=reinterpret_Cast(pNMHDR)“不断给出错误C2059:”('3.我应该如何使用此OnItemchangingList功能?因为我需要预先修复此项,以便用户无法单击它。忘记标记您@Robson
if ((pNMLV->uChanged & LVIF_STATE) && (pNMLV->uNewState & LVNI_SELECTED) && pNMLV->iItem == 0)
// is the user selecting an item?
if ((pNMLV->uChanged & LVIF_STATE) && (pNMLV->uNewState & LVNI_SELECTED) && pNMLV->iItem == 0)
{
// yes - never allow a selected item
*pResult = 1;
}
else
{
// no - allow any other change
*pResult = 0;
}