【问题标题】:Slow drawing of items in ListView with many columnsListView 中多列项目的缓慢绘制
【发布时间】:2015-08-25 15:45:39
【问题描述】:

我在虚拟模式下使用 ListView。当列数增加 (>500) - 绘图变得太慢。滚动挂起。 请告诉我如何摆脱这个问题并提高 ListView 的性能?

简单的测试项目:

public partial class Form1 : Form
    {
        private const int maxLines = 1000000;//rows
        private const int columns = 1024;
        ListViewItem lvi = new ListViewItem();            

        public Form1()
        {
            InitializeComponent(); 

            //ListView Properties
            this.listView1.FullRowSelect = true;
            this.listView1.GridLines = true;
            this.listView1.MultiSelect = false;
            this.listView1.Name = "listView1";
            this.listView1.UseCompatibleStateImageBehavior = false;
            this.listView1.View = System.Windows.Forms.View.Details;
            this.listView1.RetrieveVirtualItem += new System.Windows.Forms.RetrieveVirtualItemEventHandler(this.listView1_RetrieveVirtualItem);       
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            listView1.VirtualMode = true;
            listView1.VirtualListSize = maxLines;

            PropertyInfo aProp = typeof(ListView).GetProperty("DoubleBuffered", BindingFlags.NonPublic | BindingFlags.Instance);
            aProp.SetValue(listView1, true, null);

            //create columns
            for (int i = 0; i < columns; i++)
                listView1.Columns.Add(i.ToString(), 40);

            //create test data
            for (int i = 0; i < columns; i++)
            {
                ListViewItem.ListViewSubItem lvsi = new ListViewItem.ListViewSubItem();
                lvsi.Text = i.ToString();
                lvi.SubItems.Add(lvsi);
            }
        }

        //get item in virtual mode
        private void listView1_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
        {
            e.Item = lvi;
        }

    }

【问题讨论】:

  • 为什么需要 500+ 列?有没有其他方法可以设置您的架构?另外,请提供您的ListView 的代码,以便我们可以看到ItemTemplate
  • 有一个主要项目显示来自 sql 表的数据。转换成另一个组件 - 非常有问题。

标签: c# winforms performance listview scroll


【解决方案1】:

您需要使用 ownerdraw 或 customdraw 仅绘制可见列。您可以使用 HitTest 检查左上角的列并从那里开始...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多