在c#中向ListView添加项目太慢

本文关键字:项目 添加 ListView 中向 | 更新日期: 2023-09-27 18:18:15

我想添加一个项目到listview控件。这是一小段代码:

    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秒来完成。为什么有人知道原因?提前感谢。

Edit:

我以前定制过listview。

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

我这样做是因为我不想挂当我使用多线程。我不知道这对它有什么影响?

在c#中向ListView添加项目太慢

你可以通过启用虚拟模式使它更快。
但是,这需要一些工作。

添加多个项的首选方法是使用AddRange()方法。然而,如果你必须一个一个地添加条目,你可以在循环中使用BeginUpdate()和EndUpdate()方法。以下内容来自MSDN

将多个项目添加到ListView的首选方法是使用ListView的adrange方法。ListViewItemCollection(通过ListView的Items属性访问)。这使您能够在单个操作中将项目数组添加到列表中。但是,如果您想使用ListView的add方法一次添加一个项目。ListViewItemCollection类,你可以使用BeginUpdate方法来防止控件在每次添加项时重新绘制ListView。

很抱歉,这是一个更架构化的解决方案,但是如果您的域对象很大,这可能会导致瓶颈(阅读评论,听起来它们可能会减慢速度)。在进入表示层之前,您可以将它们扁平化为一些(非常简单的)域传输对象(dto):实际上就是一袋getter和setter。

像AutoMapper这样的工具可能会占用大量的繁重工作

这样,您的域对象将留在业务逻辑域中(它们所属的位置),而您的表示层仅从DTO获取所需的数据。

为非基于代码的建议感到抱歉:)祝你好运!