问题描述
Winform/VB.NET环境下,用listview虚拟模式加载5万条数据,能够实现数据的加载。按住垂直滚动条下拖数据可以正常展示,但在单击垂直滚动条的下拉三角按钮时,就报告错误窗体了,错误描述如下:“ListView虚拟化要求RetrieveVirtualItem事件或在OnRetrieveVirtualItem方法中提供有效的ListViewItem”,有没有好的解决办法。如图:点击10几次继续后,垂直滚动条能正常向下移动,窗体并未崩溃。这个错误在调试环境下总是捕捉不到断点,但我预计错误出在RetrieveVirtualItem事件,相关listview虚拟模式的事件代码如下:PrivatemyCache1()AsListViewItemPrivatefirstItem1AsIntegerPrivateSubLV1_CacheVirtualItems(senderAsObject,eAsSystem.Windows.Forms.CacheVirtualItemsEventArgs)HandlesLV1.CacheVirtualItemsTryIfNot(myCache1IsNothing)AndAlsoe.StartIndex>=firstItem1AndAlsoe.EndIndex<=firstItem1+myCache1.LengthThenReturnEndIffirstItem1=e.StartIndexDimlengthAsInteger=e.EndIndex-e.StartIndex'+1indexesareinclusivemyCache1=NewListViewItem(length){}DimiAsIntegerFori=0TolengthmyCache1(i)=NewListViewItem(NewString(){_DT.Rows(i+firstItem1).Item("INAME").ToString,DT.Rows(i+firstItem1).Item("CARDNUM").ToString,_DT.Rows(i+firstItem1).Item("CASE_CODE").ToString,DT.Rows(i+firstItem1).Item("COURT_NAME").ToString,DT.Rows(i+firstItem1).Item("GIST_CID").ToString,DT.Rows(i+firstItem1).Item("REG_DATE").ToString,_DT.Rows(i+firstItem1).Item("GIST_UNIT").ToString,DT.Rows(i+firstItem1).Item("DUTY").ToString,DT.Rows(i+firstItem1).Item("PERFORMANCE").ToString,DT.Rows(i+firstItem1).Item("DISREPUT_TYPE_NAME").ToString,_DT.Rows(i+firstItem1).Item("PUBLISH_DATE").ToString})NextiCatchexAsExceptionMsgBox(ex.Message.ToString)EndTryEndSubPrivateSubLV1_RetrieveVirtualItem(senderAsObject,eAsSystem.Windows.Forms.RetrieveVirtualItemEventArgs)HandlesLV1.RetrieveVirtualItemTryIfNot(myCache1IsNothing)AndAlsoe.ItemIndex>=firstItem1AndAlsoe.ItemIndex<firstItem1+myCache1.LengthThene.Item=myCache1(e.ItemIndex-firstItem1)EndIfIfe.ItemIndex=myCache1.LengthThenmyCache1=NothingCatchexAsExceptionMsgBox(ex.Message.ToString)EndTryEndSub
有遇到的的同行吗?谢谢!
解决方案
解决方案二:
相同问题,我是在多线程中通过委托调用ListView虚拟化显示,问题有时候有,有时候没有,头疼死了
解决方案三:
这个问题没人碰到吗?球大神现身!
解决方案四:
RetrieveVirtualItem()要求e.Item始终有值,但是你只有部分情形下才有值,这是错误的。看的示例是怎么做的。