簡體   English   中英

如何在C#中更快地將列表視圖滾動到Winform中列表視圖的最后一項

[英]how to faster scroll a listview to last item in listview in Winform in c#

我在winform中有一個列表視圖,其中有一個列表視圖,以便在收到新消息時滾動到列表中的最后一項。 我的問題是,當客戶端中的消息發送得如此之快時,我的系統運行緩慢且一段時間沒有響應,並且鼠標箭頭的形狀變為了滾輪。

范例范例:

        for (int i = 1; i < 10000; i++) {
            listView1.BeginUpdate();
            listView1.Items.Add(a);
            listView1.EnsureVisible(listView1.Items.Count - 1);
            listView1.EndUpdate();
        }

真實案例我的客戶
當收到新消息時,此函數從線程調用。 我的Clint代碼很大,我只顯示此代碼,因為此代碼用於在列表視圖中顯示消息。
當我們注釋滾動行時,當我們滾動到最后一條消息並且消息到達12,000時,系統性能會很好,這會降低速度。

private void HandleNewMsg(string msg)
    {           
        if(chkAppend.Checked)
        {

            if (this.InvokeRequired)
            {
                this.BeginInvoke(new AppendTextDelegate(HandleNewMsg), new object[] { msg });
            }

            else
            {
                // call here to parse the message
                ShowMessage(ParseMessage(msg));

            }
        }
    }

和顯示消息方法

private void ShowMessage(List<String>MsgReceived){
        listview1.BeginUpdate();
        foreach(var i in MsgReceived)
        {
            listview1.Items.Add(i);

        }
        listView1.EnsureVisible(listView1.Items.Count - 1);
       listview1.EndUpdate();

    }

而ParseMessage是

private List<String> ParseMessage(String Message){

        List<String> msg=new List<String>();
        msg.Add(Message.Substring(0, 13));// title such as msg received
        msg.Add("Msg Type  " + Message.Substring(41+13 , 4));
        msg.Add("p Code    " + Message.Substring(65 +13, 2));
        msg.Add("*************");
        // and other data in it .
        return msg;
    }

如何使其不掛起並滾動到“上一封郵件”?

您應該閱讀BeginUpdateEndUpdate的手冊。

為了正確使用它們,您應該按照以下方式編寫:

listView1.BeginUpdate();
for (int i = 1; i < 10000; i++)
{
    listView1.Items.Add(a);
}
listView1.EndUpdate();
listView1.EnsureVisible(listView1.Items.Count - 1);

這應添加10000個項目,然后滾動到最后一個項目。

BeginUpdateEndUpdateListView不會呈現新添加的項目,因此在添加大量項目時不會滯后。

添加並渲染后,然后滾動到最后一個。

您所做的就是多余地渲染添加的項目,然后確保其可見性-再次導致渲染的原因。 這就是您的應用程序開始滯后的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM