代码之家  ›  专栏  ›  技术社区  ›  MadBoy

ListViewColumnSorter在C中添加ListView项时出现性能问题的原因?

  •  3
  • MadBoy  · 技术社区  · 16 年前

    一段时间以来,我和一个 ListView's 填充非常慢(15秒左右3000个条目(5列)。由于sql查询在不到几秒钟的时间内返回值,这让我很生气。我查到了 ListViewColumnSorter 正在减速。当我发表评论时:

    private ListViewColumnSorter lvwColumnSorterKontrahenci = new ListViewColumnSorter();
    listViewKontrahenci.ListViewItemSorter = lvwColumnSorterKontrahenci;
    

    ListView 在1秒之内就被填满了。我一直认为,当我附加列排序器时,当我通过单击列标题实际执行它时,它就开始工作了。

     private void listViewKontrahenci_ColumnClick(object sender, ColumnClickEventArgs e) {
            ListViewColumnSorter.columnClick(listViewKontrahenci, ref lvwColumnSorterKontrahenci, sender, e, headerIcons);
    }
    

    我想在我开始之前至少有一次这样不会有问题。

    我的列表视图排序代码:

        public static void columnClick(ListView varListView, ref ListViewColumnSorter lvwColumnSorter, object sender, ColumnClickEventArgs e, ImageList headerImages) {
            //get list view header
            IntPtr hHeader = SendMessage(varListView.Handle, LVM_GETHEADER, IntPtr.Zero, IntPtr.Zero);
            SendMessage(hHeader, HDM_SETIMAGELIST, IntPtr.Zero, headerImages.Handle);
            SortOrder Order = SortOrder.Descending;
            //format icons
            HDITEM hd = new HDITEM {
                                       mask = HDI_IMAGE | HDI_FORMAT
                                   };
            for (int i = 0; i < varListView.Columns.Count; i++) {
                //    if (i != e.Column) {
                hd.fmt = HDF_LEFT | HDF_STRING;
                hd.iImage = -1;
                SendMessage(hHeader, HDM_SETITEM, new IntPtr(i), ref hd);
                //    }
            }
            hd.fmt = HDF_LEFT | HDF_STRING | HDF_BITMAP_ON_RIGHT;
            //ListViewHelper.enableDoubleBuffer(varListView);
            if (Order != SortOrder.None) {
                hd.fmt |= HDF_IMAGE;
            }
            if (e.Column == lvwColumnSorter.SortColumn) {
                if (lvwColumnSorter.Order == SortOrder.Ascending) {
                    hd.iImage = 0;
                    lvwColumnSorter.Order = SortOrder.Descending;
                } else {
                    hd.iImage = 1;
                    lvwColumnSorter.Order = SortOrder.Ascending;
                }
            } else {
                hd.iImage = 1;
                lvwColumnSorter.SortColumn = e.Column;
                lvwColumnSorter.Order = SortOrder.Ascending;
            }
            SendMessage(hHeader, HDM_SETITEM, new IntPtr(e.Column), ref hd);
            varListView.Sort();
        }
    

    那你有什么建议?每次填充时分离/连接分拣机 列表视图 还是有更好的办法?

    1 回复  |  直到 16 年前
        1
  •  4
  •   Hans Passant    16 年前

    它将在每次添加项时对项进行排序。暂时禁用排序或使用items.addRange()方法同时添加一组项。每次添加一个时,请考虑begin/endupdate()。