2013-05-03 66 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

相关问题