ListViewColumnSorter在C#中添加listView项时出现性能问题?

时间:2010-04-13 15:14:09

标签: c# performance listview

有一段时间我一直遇到困难,我的一个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);
}

我认为,直到我开始至少一次这样,这不会是一个问题。

我的listview排序代码:

    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();
    }

那么你的建议是什么?每次填充ListView或者有更好的方法时,要分离/附加分拣机?

1 个答案:

答案 0 :(得分:4)

每次添加项目时都会对项目进行排序。要么暂时禁用排序,要么使用Items.AddRange()方法同时添加一堆项目。当您一次添加一个时,请考虑使用Begin / EndUpdate()。