Добавление элементов в ListView слишком медленно в C # - PullRequest
5 голосов
/ 20 декабря 2011

Я хочу добавить элемент в список управления.Это немного кода:

    this.lView.ListViewItemSorter = null;
    ListViewItem[] lvitems = new ListViewItem[ListMyObjects.Count];
    int index = 0;
    foreach (MyObject object in ListMyObjects)
        {
            ListViewItem item = new ListViewItem();               
            item.Text = object.Name;
            lvitems[index++] = item;
        }
    this.lView.BeginUpdate();
    this.lView.Items.AddRange(lvitems); // Slow in here with debugger
    this.lView.EndUpdate();

Я только добавляю около 1000 пунктов, но это очень медленно.Это потратить около 15 секунд, чтобы закончить.почему кто-то знает причину?Заранее спасибо.

Редактировать :

Я уже настраивал просмотр списка ранее.

public partial class MyListView: ListView
{        
    public MyListView()
    {
        InitializeComponent();
        this.View = View.Details;
        this.FullRowSelect = true;
        this.DoubleBuffered = true;
    }
    private bool mCreating;
    private bool mReadOnly;
    protected override void OnHandleCreated(EventArgs e)
    {
        mCreating = true;
        base.OnHandleCreated(e);
        mCreating = false;
    }
    public bool ReadOnly
    {
        get { return mReadOnly; }
        set { mReadOnly = value; }
    }
    protected override void OnItemCheck(ItemCheckEventArgs e)
    {
        if (!mCreating && mReadOnly) e.NewValue = e.CurrentValue;
        base.OnItemCheck(e);
    }   
}

Я делаю это, потому что не хочу зависать, когда использую многопоточность.Я не знаю, что это повлияло на это?

Ответы [ 3 ]

3 голосов
/ 20 декабря 2011

Вы можете сделать это намного быстрее, включив виртуальный режим .
Однако это потребует некоторой работы.

2 голосов
/ 20 декабря 2011

Предпочтительным способом добавления нескольких элементов является использование метода AddRange () . Однако, если вам нужно добавлять элементы по одному, вы можете использовать методы BeginUpdate () и EndUpdate () вокруг вашего цикла. Следующее от MSDN

Предпочтительным способом добавления нескольких элементов в ListView является использование метода AddRange ListView.ListViewItemCollection (доступ к которому осуществляется через свойство Items объекта ListView). Это позволяет добавлять массив элементов в список за одну операцию. Однако, если вы хотите добавлять элементы по одному, используя метод Add класса ListView.ListViewItemCollection, вы можете использовать метод BeginUpdate, чтобы запретить элементу управления перерисовывать ListView при каждом добавлении элемента.

0 голосов
/ 20 декабря 2011

Извинения за более архитектурное решение, но если ваши доменные объекты большие, это может вызвать узкое место (чтение комментариев звучит так, как будто они замедляют его). Прежде чем попасть на уровень представления, вы можете объединить их в несколько (очень простых) объектов переноса доменов (DTO): буквально просто мешок получателей и установщиков.

Инструмент наподобие AutoMapper может потенциально потратить на это немало усилий

Таким образом, ваши доменные объекты остаются в домене бизнес-логики (там, где они принадлежат), и ваш уровень представления просто получает необходимые данные из DTO.

Извините за предложение, не основанное на коде :) удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...