2013-05-03 103 views
1

我正在嘗試使用ListView將實時日誌輸出到Windows窗體。如何在添加每個項目後創建ListView更新?

這是僞代碼:

public Form1() 
    { 
     InitializeComponent(); 
     listView1.View = View.Details; 
     listView1.GridLines = false; 
     listView1.Scrollable = true; 

     listView1.FullRowSelect = true; 
     listView1.Columns.Add("Track"); 
     listView1.Columns.Add("Status"); 

     for (int i = 1; i <= 10000; i++) 
     { 
      ListViewItem LVI = new ListViewItem("Track " + i); 
      LVI.SubItems.Add("Updated"); 
      listView1.Items.Add(LVI); 
      listView1.TopItem = LVI; 
      listView1.EnsureVisible(listView1.Items.Count - 1); 
     } 
    } 

我怎樣才能設置,以便它刷新添加每行之後?目前,應用程序一直等待直到列表生成,然後用完整列表加載表單。

+0

你從哪裏獲取和存儲數據? – JayH 2013-05-03 09:51:52

+0

出於這個目的,它只是一個數字列表(即for-next循環) - 我將把實際數據放在後面 – Ben 2013-05-03 09:53:03

+0

如果您使用的是SQL數據庫,那麼您只需清除該列表並調用數據再次。不知道你會如何去這樣做,雖然 – JayH 2013-05-03 09:54:29

回答

5

您可以在另一個線程填寫的數據項(例如,使用任務):

Application.DoEvents()...處理所有窗口消息和重畫組件。

public Form1() 
     { 
      InitializeComponent(); 
      listView1.View = View.Details; 
      listView1.GridLines = false; 
      listView1.Scrollable = true; 

      listView1.FullRowSelect = true; 
      listView1.Columns.Add("Track"); 
      listView1.Columns.Add("Status"); 

      Task t = new Task(new Action(() => 
       { 
        RefreshLines(); 
       })); 
      t.Start(); 
     } 

     public void RefreshLines() 
     { 
      if (this.InvokeRequired) 
      { 
       this.Invoke(new MethodInvoker(this.RefreshLines)); 
      } 
      for (int i = 1; i <= 10000; i++) 
      { 
       ListViewItem LVI = new ListViewItem("Track " + i); 
       LVI.SubItems.Add("Updated"); 
       listView1.Items.Add(LVI); 
       listView1.TopItem = LVI; 
       listView1.EnsureVisible(listView1.Items.Count - 1); 
       Application.DoEvents(); 
      } 
     } 

你可以調用this.Refresh();而不是Application.DoEvents();

+0

Legend!這正是我需要的... – Ben 2013-05-03 10:18:15

+0

不客氣! – misak 2013-05-03 10:20:54

+1

這樣它會被調用兩次。 你需要在行後添加'return;':this.Invoke ...' – Gh61 2015-12-03 13:03:31

0

您可以撥打this.Invalidate()this.Refresh()來更新它。

+0

這似乎不起作用。已經在循環中添加了this.refresh(),它仍然提供了完整的表格,而不是即時更新 – Ben 2013-05-03 09:54:51

1

刷新不起作用,因爲它只會更新已經在列表視圖中的內容,而不是添加的項目。

也許你應該看看這個:

Listview items not showing

相關問題