如何防止CListCtrl选择其他行?我作一数据库更新操作,ListCtrl每次作对应移动(选择)就会更新数据库,如果更新失败,不允许他移动,而且要提示错误。这个ListCtrl是单选的。
我尝试过在ItemChanged事件中重新设置选择行,但是错误提示竟然弹出两次。谢谢!下面是我的代码,其中m_nItem是类成员,UpdateElementInfo是数据库操作,如果操作失败,会弹出对话框,但是执行的时候弹出了两次对话框!void CWebMethodDBDlg::OnLvnItemchangedListElement(
          NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
*pResult = 0;

if((pNMLV->uNewState & LVIS_SELECTED) && 
                   !(pNMLV->uOldState&LVIS_SELECTED))
{
int nItem=pNMLV->iItem;
if(nItem==-1||nItem==m_nItem) return;
if(m_nItem!=-1)
{
if(!UpdateElementInfo(m_nItem))
{
m_lstElement.SetItemState(m_nItem,LVIS_SELECTED|LVIS_FOCUSED,LVIS_SELECTED|LVIS_FOCUSED);
return;
}
}
m_nItem=nItem;
LoadElementInfo(nItem);        
}
}

解决方案 »

  1.   

    因为别的函数中的代码有可能同时响应了ItemChange事件,设一个中间变量,在所有的有人为的Item修改操作的地方同步
      

  2.   

    LVN_ITEMCHANGINGReturns TRUE to prevent the change, or FALSE to allow the change
      

  3.   

    handle LVN_ITEMCHANGING and cancel changes
    check select state of item to determin which item is about to be deselected
      

  4.   

    if(List.GetItemState(i,2) ==LVIS_SELECTED) 
        return i;
       //i为选中元素的索引值
      

  5.   

    void CWebMethodDBDlg::OnItemchangingList1(NMHDR *pNMHDR, LRESULT *pResult)
    {
    LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
    *pResult = 0;

    if((pNMLV->uNewState & LVIS_SELECTED) && 
                       !(pNMLV->uOldState&LVIS_SELECTED))
    {
    int nItem=pNMLV->iItem;
    if(nItem==-1||nItem==m_nItem) return;
    if(m_nItem!=-1)
    {
    if(!UpdateElementInfo(m_nItem))
    {
    m_lstElement.SetItemState(m_nItem,LVIS_SELECTED|LVIS_FOCUSED,LVIS_SELECTED|LVIS_FOCUSED);
    return;
    }
    }
    m_nItem=nItem;
    LoadElementInfo(nItem);        
    }}