3 Stimmen

ListViewColumnSorter Ursache von Leistungsproblemen beim Hinzufügen von listView Items in C#?

Seit einiger Zeit habe ich Schwierigkeiten mit einem meiner ListView's wird sehr langsam aufgefüllt (3000 Einträge in 15 Sekunden oder so (mit 5 Spalten). Es machte mich wahnsinnig, da die Sql-Abfrage Werte in weniger als einer Sekunde zurückgab. Ich habe es aufgespürt ListViewColumnSorter die die Verlangsamung verursacht. Wenn ich auskommentiert:

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

ListView wurde innerhalb von 1 Sekunde aufgefüllt. Ich dachte immer, dass, wenn ich anhängen Spaltensortierer es beginnt es seine Arbeit, wenn ich tatsächlich ausführen, indem Sie auf Spaltenkopf.

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

Ich dachte, dass es kein Problem sein würde, bis ich es wenigstens einmal so gestartet habe.

Code für meine Listenansicht Sortierung:

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

Was würden Sie mir also raten? Zu lösen / befestigen Sorter jedes Mal, wenn ich zu füllen ListView oder gibt es einen besseren Weg?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X