c#winform程序,做CAN通信项目,数据量很大,我写了一个CANHelper类,在这个类里定义了一个委托事件,在form.cs中注册了这个事件,当有CAN数据到来时,form类中的事件就会处理数据,处理好后,将数据显示到指定的listview某行某列中,但是,经测试,给listview赋值时太慢了,就导致了CAN缓存中存了大量的数据,导致数据显示不及时,请问高手们,这种情况如何处理?
                    if (monitorParameter[i].DataType == "bit")
                            {
                                int bitaddr = Convert.ToInt32(monitorParameter[i].bitAddr);
                                str = DecimalConvert.HexStringToBinString(item.Data.Substring(byteaddr * 2, 2));
                                string[] strReverse = ReverseString(str);
                                strData = (Convert.ToInt32(strReverse[bitaddr]) * resolution) + offset;                                if ((strData > valueMax) || (strData < valueMin))
                                {
                                    AddDataToListView(listView1, i, 4, strData.ToString("F0"), Color.Red, 1);
                                }
                                else
                                {
                                    AddDataToListView(listView1, i, 4, strData.ToString("F0"), Color.White, 0);
                                }
                                AddDataToListView(listView1, i, 2, item.Data.Substring(byteaddr * 2, 2), Color.White, 0);
                            }

解决方案 »

  1.   

    google C# listview virtualmode
      

  2.   

    在你的代码中看不到从 CAN缓存中 移除已处理数据的动作
     
      

  3.   

    ltView.Items[row].SubItems[column].Text = strdata;
    我没有贴出来,在AddDataToListView方法里的这条语句耗时,是不是我赋值方式有问题?
      

  4.   

    将listview的数据源单独提取出来进行操作,操作完成后再绑定到listview,不要直接在控件上进行操作,因为控件上数据变化会引起控件界面刷新,这个耗时间。
      

  5.   

    因为我的程序是实时通信,获取到数据并处理后,就需要立即显示在listview上,我用的是ltView.Items[row].SubItems[column].Text = strdata;请问您说的绑定,应该怎么绑定呢?下面是加载好的listview,实时数据需要放到第三列和第五列上
      

  6.   

    listview性能不会低的,看到很多硬件的demo,都是用listview显示数据。
    更新ui,用begininvoke足够了。如果还卡,那就是更新频率过高了。更新频率过高没有意义,人眼识别不出来。最简单的方式,就是把更新频率降下来。
      

  7.   

    List<T> dataCollection = new List<T>();
    对dataCollection 赋值,
    ListView.DataSource = dataCollection ;
    需要对ListView的显示格式进行下设置
      

  8.   

    虚列表怎么会卡……你的后台读到新数据都不用通知listview去更新的,除非是更新到了当前显示的那几十条。
    而且更新几十条要多少时间……RetrieveVirtualItem里面主要的工作就是string.format。你就算每秒刷新个上百次,加个CacheVirtualItems也能搞定。