C# 添加每个项目后,如何更新ListView?
我正在尝试使用ListView将实时日志输出到windows窗体 这是虚拟代码: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;
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…