本帖最后由 tiger9991 于 2013-04-25 08:47:06 编辑

解决方案 »

  1.   

    请问该如何解决这个问题曾经尝试过把第31行改为int i = m_current / 5000 ;
    单击的时候正常了,但是很遗憾,和程序的其他功能有冲突
      

  2.   

    难为这位大神了,我也是研究了好几晚上,现在问题解决了这个问题也可以这么表述:
    初始化时一次读入了1至5000项并选中了其中一项(比如说第25项,这个数字是被保存起来的,以备显示选中的项的信息),然后拖动滚动条拖到5000项以外(比如显示第8000项),这个时候就要重新读入5001至10000项了,此时显示是正常的。
    但是单击列表框某一项时(比如单击的是第8000项),这一项消失了(就是这一项的位置被选中,但是条目看不见了)。调试发现此时函数中的iItemIndx并不是选中的7999,而是24(第一次选中的第25项),所以m_temp里此时存储的不是第5001至10000项,而是1至5000项,显示就要出错,读取也不正常解决办法就是用我在二楼贴的语句,并且把9至17行改为
    m_current = m_list.GetTopIndex () ;
    21行改为(m_current > m_Lastorder || m_current < m_Firstorder)其实就是个逻辑问题,没什么技术含量,见笑了
      

  3.   

    难为这位大神了,我也是研究了好几晚上,现在问题解决了这个问题也可以这么表述:
    初始化时一次读入了1至5000项并选中了其中一项(比如说第25项,这个数字是被保存起来的,以备显示选中的项的信息),然后拖动滚动条拖到5000项以外(比如显示第8000项),这个时候就要重新读入5001至10000项了,此时显示是正常的。
    但是单击列表框某一项时(比如单击的是第8000项),这一项消失了(就是这一项的位置被选中,但是条目看不见了)。调试发现此时函数中的iItemIndx并不是选中的7999,而是24(第一次选中的第25项),所以m_temp里此时存储的不是第5001至10000项,而是1至5000项,显示就要出错,读取也不正常解决办法就是用我在二楼贴的语句,并且把9至17行改为
    m_current = m_list.GetTopIndex () ;
    21行改为(m_current > m_Lastorder || m_current < m_Firstorder)其实就是个逻辑问题,没什么技术含量,见笑了
    解决了??
      

  4.   

    这个是我一个不太成熟的想法,因为对虚列表一点都不熟悉:比如此时显示区域内第一条是是第4998项(索引4997),由于我一屏显示25条,所以此时OnGetdispinfoList会响应25次,每次iItemIndx都会增加,假如增到了5000,就该读取5001至10000项了,然而第4998项还得显示,所以就会出错。
    每次多读的50项是为了处理这个边界问题,我的那个m_bNeedRead也是为了防止这种错误而设置的一个flag,当还有前5000项的条目需要显示时就不读后5000项。由于设置的关卡太多到最后自己都晕菜了,改进后的方法简洁了很多,我在五楼贴出来了
      

  5.   

    难为这位大神了,我也是研究了好几晚上,现在问题解决了这个问题也可以这么表述:
    初始化时一次读入了1至5000项并选中了其中一项(比如说第25项,这个数字是被保存起来的,以备显示选中的项的信息),然后拖动滚动条拖到5000项以外(比如显示第8000项),这个时候就要重新读入5001至10000项了,此时显示是正常的。
    但是单击列表框某一项时(比如单击的是第8000项),这一项消失了(就是这一项的位置被选中,但是条目看不见了)。调试发现此时函数中的iItemIndx并不是选中的7999,而是24(第一次选中的第25项),所以m_temp里此时存储的不是第5001至10000项,而是1至5000项,显示就要出错,读取也不正常解决办法就是用我在二楼贴的语句,并且把9至17行改为
    m_current = m_list.GetTopIndex () ;
    21行改为(m_current > m_Lastorder || m_current < m_Firstorder)其实就是个逻辑问题,没什么技术含量,见笑了
    解决了??嗯,现在可以随便拽滚动条了