xuyunhai20160827 Ответов: 1

Как решить проблему низкой эффективности сцинтилляционных элементов управления ListView


Я сделал тест,я хочу следить за увеличением индекса строки listview,поэтому я использую следующий код:
<pre>

Thread thFollowListView = new Thread(new ThreadStart(FollowListViewRowIndex));
thFollowListView.Start();

int iRowIndex = 0;
private void FollowListViewRowIndex()
 {
            while (true)
            {
              
                    this.listview.Invoke((EventHandler)delegate
                   {
                      
                           listview.Items[iRowIndex].Selected = true;
                           listview.Items[iRowIndex].Focused = true;

                           if (iRowIndex + 20 < listview.Items.Count)
                           {
                               listview.Items[iRowIndex + 20].EnsureVisible();
                           }

                           listview.Update();
                       
                   });
                
		iRowIndex++;
                Thread.Sleep(100);
            }
}



я хочу показать по крайней мере 20 строк,поэтому я использую
listview.Items[iRowIndex + 20].EnsureVisible();

но элемент управления listview мерцает, как я могу решить этот вопрос?

Что я уже пробовал:

public CustomListView()
    : base()
{
    base.OwnerDraw = true;
    //this.DoubleBuffered = true;

    SetStyle(ControlStyles.DoubleBuffer | ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);
    UpdateStyles();

}


Я использую атрибут double buffer, но это бесполезно.
Я использую делегат c#, и я тоже не полезен.

1 Ответов

Рейтинг:
0

#realJSOP

Попробуйте добавить это в свой пользовательский класс listview:

virtual  void OnNotifyMessage(Message m) override
{
    //Filter out the WM_ERASEBKGND message
    if(m.Msg != WM_ERASEBKGND)
    {
        ListView::OnNotifyMessage(m);
    }
}