如何专门防止或锁定列表控件中的行选择(报表视图)

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 列表视图选择更改时按下键和列表视图根据第一列自动查找下一行

如何在报表样式中增加列表视图的行高?

即使焦点在另一个控件上,如何更改列表视图选定的行背景颜色?

R Shiny DataTable如何防止包含超链接的列中的行选择/取消选择

TableLayoutPanel隐藏指定的行和列 求指导

VC中listview控件怎么使用(C语言)