2017-09-16 42 views
0

我有一個列表視圖在winform列表視圖滾動到列表中的最後一個項目時,新消息來了。 我的問題是,當消息在我的客戶端速度如此之快時,我的系統速度很慢,一段時間沒有響應,我的鼠標箭頭更改爲滾輪形狀。如何更快地滾動列表視圖到列表視圖在Winform在c#中的最後一項#

樣本實施例:

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

我怎樣才能使它不掛,滾動到最後訊息?

+1

用戶傾向於感謝休息時間,不得不通過成千上萬的項目,可以非常疲憊。創建可用的用戶界面,你不必解決這個問題。看看Google如何呈現一百萬個查詢點擊量。 –

+0

消息如何傳遞?這個例子並沒有顯示真正的問題。顯示真實的代碼。 –

+0

@HansPassant是的,但對於通用解決方案,您需要支持自動分組/摺疊的控件。你必須自己編寫或使用第三方庫,這兩個選項都可能帶來問題。 –

回答

1

您應該閱讀BeginUpdateEndUpdate的手冊。

爲了正確地使用它們,你應該把它寫方式如下:

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

這應該添加10000項,然後滾動到最後一個。

BeginUpdateEndUpdate之間,ListView不會渲染新添加的項目,因此添加大量項目時不會延遲。

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

你做了什麼,是冗餘渲染添加的項目,然後確保它的可見性 - 又是什麼導致了渲染。這就是你申請開始滯後的原因。

+0

逐個添加通常比AddRange慢。 –

+0

檢查我的真實代碼,當我們評論Scroll Lines時,我上傳然後系統執行良好。我們如何有效地將列表滾動到最後一條消息。 –