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开始)

如果您希望在对话框中执行此操作,而不必派生自己的类
  • 在对话框类中声明CListCtrl变量
  • 将方法声明添加到对话框中

    afx_msg void-OnItemchangingList(NMHDR*pNMHDR,LRESULT*pResult)

  • 将条目添加到消息映射中
    
    开始消息映射(CMyDialog,CDialog)
    ON_NOTIFY(LVN_项目更改、IDC_列表1和CMyDialog::OnItemchangingList) 结束消息映射()

  • 将该方法添加到对话框的“.cpp”文件中(与ClistView方法相同)

    无效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;
    }