一个数据库操作,控制面板放在子对话框上,数据显示由主窗口实现,为何调用SetItemText时 
出现Debug   Assertion   Failed! 
在winctrl2.cpp中的ASSERT((GetStyle()   &   LVS_OWNERDATA)==0)处异常终止。 
程序中更新数据的代码为: 
((CDataOperateDlg*)AfxGetMainWnd())-> m_List-> SetItemText(nRow,1,rs.m_lPONo==adFldOK?rs.m_chPONo:_T("")); 
所要更新的数据内容本身是不存在问题的,把语句写成SetItemText(nRow,1,_T(""))报同样的错误。
主窗口上放了一个CTabCtrl,控制面板放在CTabCtrl中的页面上。

解决方案 »

  1.   

    逐步判断每个函数的返回;
    比如AfxGetMainWnd(),需要判断是哪个窗口;
    不要把窗口对象弄错了,指针指错了位置了吧
      

  2.   

    从ASSERT代码看,拥有LVS_OWNERDATA风格的窗口禁止这样更新,这种风格很特殊的,参考下面文章
    http://msdn2.microsoft.com/en-us/library/bb774735(VS.85).aspx
      

  3.   

    指针是没错的,因为在SetItemText之前还有一个插入新行的操作,此时是正常的。
    nRow=((CDataOperateDlg*)AfxGetMainWnd())->m_List.InsertItem(i,chID);
    在这句后放断点,发现已经正常从数据库读到了值,而且nRow已经返回了第一行的行号,
    说明插入第一行成功,但是一到SetItemText插入数据时便异常终止了。而且我并没有设置LVS_OWNERDATA属性,我曾经试过通过lStyle &= ~LVS_OWNERDATA
    强制去除LVS_OWNERDATA属性也是报同样错误,所以很纳闷,不清楚到底哪里有问题。