我正在尝试使用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);
}
}
如何设置它以便在添加每一行后刷新?当应用程序等待生成列表时,然后加载带有完整列表的表单。
答案 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)
答案 2 :(得分:0)
您可以在表单上致电this.Invalidate()
或this.Refresh()
进行更新。