我的程序由于要向列表中插入大量的数据,因此自己派生了一个列表,重载了LVN_GETDISPINFO消息。
并修改了OWNERDATA属性,可是后来要修改列表中的数据时,发现当列表调用SetItemText函数时,就会出现问题,跟踪调试发现,错误是由OWNERDATA属性所引起的。 不知道,该如何解决,急,大哥门帮帮忙啊。

解决方案 »

  1.   

    你用了虚拟列表,就不用SetItemText了。在GetDispInfo里对相应Item赋值。
      

  2.   

    可以说具体点么,楼上的大哥(比如修改第一行第一列的值时,是向列表发送消息,还是直接调用GetDispInfo函数(改一哈参数),还是用别的什么方法来搞啊?我对虚拟列表不太熟悉,是模仿一个列子直接进行修改的(原列子未涉及到修改)。
      

  3.   

    你只要告诉list你需要改动了m_List.Invalidate(),那么它会触发GetDispInfo的。
    因为这个数据都是你自己负责存储的,所以你只要改变你存储的内容,然后告诉list你要改变了,就可以了。还有一个m_List.SetItemCountEx是告诉list你有多少条记录。
      

  4.   

    谢谢大哥帮忙,但我的程序还是有点问题。
    我的OnGetdispinfo(NMHDR* pNMHDR, LRESULT* pResult)函数如下 
             LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
    LV_ITEM* pItem= &(pDispInfo)->item;
    int iItemIndex= pItem->iItem;
    DATA *ptr = array[iItemIndex];
    if(pItem->mask & LVIF_TEXT)//为什么调用m_List.Invalidate()后没有执行到语句体内?
    //这样好象就不能更新内容了哦。
    {
    switch(pItem->iSubItem)
    {
    case 0:
    lstrcpyn(pItem->pszText, ptr->GroupNo, pItem->cchTextMax);
    break;
                      ……//
                       }
              }
    大哥还能再帮忙看看不?
      

  5.   

    你还要m_List.SetItemCountEx()告诉list有多少项啊。