C# 添加每个项目后,如何更新ListView?

C# 添加每个项目后,如何更新ListView?,c#,winforms,listview,logging,C#,Winforms,Listview,Logging,我正在尝试使用ListView将实时日志输出到windows窗体 这是虚拟代码: public Form1() { InitializeComponent(); listView1.View = View.Details; listView1.GridLines = false; listView1.Scrollable = true; listView1.FullRowSelect = true;

我正在尝试使用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);
        }
    }
public Form1()
{
初始化组件();
listView1.View=View.Details;
listView1.GridLines=false;
listView1.Scrollable=true;
listView1.FullRowSelect=true;
listView1.Columns.Add(“跟踪”);
listView1.Columns.Add(“状态”);

对于(int i=1;i您可以在表单上调用
this.Invalidate()
this.Refresh()
来更新它。

您可以在表单上调用
this.Invalidate()
this.Refresh()
来更新它。

刷新不起作用,因为它只会更新列表视图中已经存在的内容,而不会更新添加的项目

也许你应该看看这个:


刷新将不起作用,因为这只会更新listview中已有的内容,而不会更新添加的项目

也许你应该看看这个:


您可以在另一个线程中填充数据项(例如使用任务):

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();
            }
        }
public Form1()
{
初始化组件();
listView1.View=View.Details;
listView1.GridLines=false;
listView1.Scrollable=true;
listView1.FullRowSelect=true;
listView1.Columns.Add(“跟踪”);
listView1.Columns.Add(“状态”);
任务t=新任务(新操作(()=>
{
刷新行();
}));
t、 Start();
}
公共空白刷新行()
{
if(this.invokererequired)
{
Invoke(newmethodinvoker(this.RefreshLines));
}

对于(int i=1;i您可以在另一个线程中填充数据项(例如使用task):

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();
            }
        }
public Form1()
{
初始化组件();
listView1.View=View.Details;
listView1.GridLines=false;
listView1.Scrollable=true;
listView1.FullRowSelect=true;
listView1.Columns.Add(“跟踪”);
listView1.Columns.Add(“状态”);
任务t=新任务(新操作(()=>
{
刷新行();
}));
t、 Start();
}
公共空白刷新行()
{
if(this.invokererequired)
{
Invoke(newmethodinvoker(this.RefreshLines));
}

for(int i=1;i您从哪里获取和存储数据?出于此目的,它只是一个数字列表(即for next循环)-我稍后会将真实数据放入。如果您使用的是SQL数据库,那么您只需清除列表并再次调用数据。不确定您将如何执行此操作,因为数据实际上是代码将对其执行操作的文件列表。操作应为:更新文件,向日志报告是否t工作/失败,然后对下一个文件重复此操作。您从何处获取和存储数据?出于此目的,它只是一个数字列表(即下一个循环)-我稍后会将真实数据放入。如果您使用的是SQL数据库,那么您只需清除列表并再次调用数据。不确定您将如何执行此操作,因为数据实际上是代码将对其执行操作的文件列表。操作应为:更新文件,向日志报告是否t工作/失败,然后对下一个文件重复此操作。此操作似乎不起作用。已在循环中添加此.refresh(),但它仍然显示完整的表单,而不是在fly上更新此操作。此操作似乎不起作用。已添加此.refresh()在循环内部,它仍然显示完整的表单,而不是在fly上进行更新。这样它将被调用两次。您需要在以下行之后添加
return;
:this.Invoke…
这样它将被调用两次。您需要在以下行之后添加
return;
:this.Invoke…