如何在添加每个项目后进行ListView更新?

时间:2013-05-03 09:50:09

标签: c# winforms listview logging

我正在尝试使用ListView将实时日志输出到Windows窗体。

这是虚拟代码:

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

如何设置它以便在添加每一行后刷新?当应用程序等待生成列表时,然后加载带有完整列表的表单。

3 个答案:

答案 0 :(得分: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();

答案 1 :(得分:1)

刷新将不起作用,因为它只会更新列表视图中已有的内容,而不是已添加的项目。

也许你应该看看这个:

Listview items not showing

答案 2 :(得分:0)

您可以在表单上致电this.Invalidate()this.Refresh()进行更新。