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

时间:2015-04-22 04:54:14

标签: mfc row listcontrol

美好的一天,

我创建List_Control报告视图的目的是生成一个数据列表,当然用户可以选择他们想要的数据。所以我的问题是显示的第一个项目应该是参考(或)只读目的。这意味着我不希望用户选择它。我已经在网上搜索了几个月的编程背景,这些背景真的很难理解。我使用下面的方法来生成我的数据列表。

    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没有提供它。

*侧面话题abit,对我这样的初学者的MFC书的任何推荐?

提前感谢您的回复。

/凯文

1 个答案:

答案 0 :(得分:1)

找到它了!

如果要派生自己的类或使用CListView

还有另一个关于堆栈溢出的问题,您可以在其中收集禁用选择所需的信息。 How to disable the CListCtrl select option

所以"阻止"只需在第一项上选择你只需在&#34中添加条件;如果"检查"更改" item是你想要的,在你的情况下是第一个(索引从0开始)

if ((pNMLV->uChanged & LVIF_STATE) && (pNMLV->uNewState & LVNI_SELECTED) && pNMLV->iItem == 0)

如果您想在对话框中执行此操作而不派生自己的类

  1. 在对话框类中声明CListCtrl变量
  2. 将方法声明添加到对话框

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

  3. 将条目添加到消息映射中 BEGIN_MESSAGE_MAP(CMyDialog, CDialog)
    ON_NOTIFY(LVN_ITEMCHANGING, IDC_LIST1, &CMyDialog::OnItemchangingList) END_MESSAGE_MAP()

  4. 将方法添加到" .cpp"对话框的文件(与ClistView方法相同)

    void CMyDialog::OnItemchangingList(NMHDR *pNMHDR, LRESULT *pResult) { // LVN_ITEMCHANGING notification handler 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;
    }
    

    }

  5. // 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; }