[英]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;
}
如何使其不掛起並滾動到“上一封郵件”?
您應該閱讀BeginUpdate
和EndUpdate
的手冊。
為了正確使用它們,您應該按照以下方式編寫:
listView1.BeginUpdate();
for (int i = 1; i < 10000; i++)
{
listView1.Items.Add(a);
}
listView1.EndUpdate();
listView1.EnsureVisible(listView1.Items.Count - 1);
這應添加10000個項目,然后滾動到最后一個項目。
在BeginUpdate
和EndUpdate
, ListView
不會呈現新添加的項目,因此在添加大量項目時不會滯后。
添加並渲染后,然后滾動到最后一個。
您所做的就是多余地渲染添加的項目,然后確保其可見性-再次導致渲染的原因。 這就是您的應用程序開始滯后的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.