如何专门防止或锁定列表控件中的行选择(报表视图)
Posted
技术标签:
【中文标题】如何专门防止或锁定列表控件中的行选择(报表视图)【英文标题】:How to specifically prevent or lock a Row selection in a List Control (Report View) 【发布时间】:2015-04-22 04:54:13 【问题描述】:早安,
我创建 List_Control Report 视图的目的是生成数据列表,当然用户可以选择他们想要的数据。所以我的问题是显示的第一个项目应该是参考(或)只读目的。这意味着我不希望用户选择它。我已经在网上搜索了几个月的编程背景,这真的很难理解。我使用下面的方法来生成我的数据列表。
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书推荐给像我这样的初学者吗?
提前感谢您的回复。
/凯文
【问题讨论】:
有一种方法可以“阻止”选择,但是,这真的是您需要的吗?如果您不希望用户选择它,那么该项目是否应该在列表框中?这些信息不应该在其他地方吗,比如在标签或标题中? 是的,我明白你的观点来自哪里。如果我找不到阻止用户点击它的方法。正如你提到的,我只是放在另一个地方。我将它们放在一起的目的是因为它们共享我从 LVCOLUMN 生成的相同列信息。抱歉我的解释不好,希望你能明白。 我明白了。但是我仍然认为您应该将该信息放在一个单独的区域中,用户肯定会单击它并问自己:“为什么我不能单击它?”,所以除非有其他原因,在我的意见,您应该将其从“主列表框”中删除并将其放在其他位置。不管怎样,我自己也在尝试,因为这是一个有趣的练习 =) 无论如何,您是使用 CListView 还是 CDialog 作为 CListControl 的父级? 嗨@Robson,我的程序只有一个列表视图,所以我猜CListView是我的主要视图。 【参考方案1】:找到了!
如果你想派生自己的类或使用 CListView
已经有另一个关于堆栈溢出的问题,您可以在其中收集禁用选择所需的信息。 How to disable the CListCtrl select option
所以要“防止”仅在第一个项目上进行选择,您只需在“if”中添加一个条件,检查“更改”项目是否是您想要的,在您的情况下是第一个(索引开始0)
if ((pNMLV->uChanged & LVIF_STATE) && (pNMLV->uNewState & LVNI_SELECTED) && pNMLV->iItem == 0)
如果您想在对话框中执行此操作而不派生自己的类
-
在对话框类中声明 CListCtrl 变量
在对话框中添加方法声明
afx_msg void OnItemchangingList(NMHDR *pNMHDR, LRESULT *pResult);
将条目添加到您的消息映射
BEGIN_MESSAGE_MAP(CMyDialog, CDialog)
ON_NOTIFY(LVN_ITEMCHANGING, IDC_LIST1, &CMyDialog::OnItemchangingList)
END_MESSAGE_MAP()
将方法添加到对话框的“.cpp”文件中(与 ClistView 方法相同)
void CMyDialog::OnItemsharingList(NMHDR *pNMHDR, LRESULT *pResult) // LVN_ITEMCHANGING 通知处理程序 LPNMLISTVIEW pNMLV = reinterpret_cast(pNMHDR);
// 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;
【讨论】:
是的,我昨天看到了这个。我很难理解如何从我自己的班级派生出来。但我决定试一试! 好的,我刚刚找到了一种不导出它的方法,我会更新答案 @KevinYong 刚刚阅读了您对 CListView 的其他评论,因为它只是封装了 CListrCtrl 您可以使用“ON_NOTIFY_REFLECT(LVN_ITEMCHANGING”) 抱歉迟到了,感谢您的回复。 1. 我在输入消息映射条目时遇到问题。我必须删除字符'&'一个我猜的指针,否则在编译时会收到错误。 2. "LPNMLISTVIEW" pNMLV= reinterpret_Cast(pNMHDR)" 也一样,一直报错 C2059 : '(' 3. 我应该如何使用这个 OnItemchangeList 函数?因为我需要预先修复这个项目,这样用户将无法点击就可以了。 忘记标记你@Robson以上是关于如何专门防止或锁定列表控件中的行选择(报表视图)的主要内容,如果未能解决你的问题,请参考以下文章
如何防止 C# WinForm 列表视图选择更改时按下键和列表视图根据第一列自动查找下一行