我正在尝试实时更新/绘制列表框,但我遇到了一些问题。 我有一个按钮来开始填充列表框 button_traceroute_Click 的过程。
我的问题是,当整个过程(按钮点击)结束时,列表框仅被绘制/更新,我希望逐个插入(查看)项目。我已经尝试过使用ListBox.Update()但没有任何反应。 (这是一个traceroute)
private void button_traceroute_Click(object sender, EventArgs e)
{
String target;
int i = 0;
target = textBox_target.Text;
Mydata data = new Mydata();
TraceRoute traceroute = new TraceRoute();
while (i < 50 && !data.getReached() && !data.getError()) // i = hop count
{
data = traceroute.startTrace(target, data, i);
listBox_trace.Items.Add(data.getOutput());
i++;
}
}
data.getOutput()返回(字符串)类似于:“Hop X:165.468.354.4 - &gt; 50 ms”或“Hop X:Timeout”
Mydata{
bool Finish flag;
bool Error flag;
int badcounter;
String output;
}
现在我用字符串填充列表框,但目标是使用一个对象。
答案 0 :(得分:4)
您需要将长时间运行的操作放在它自己的线程上。然后间歇地将进度报告回UI。
您可以在我的另一篇帖子here.
中看到如何执行此操作的示例答案 1 :(得分:0)
此外,您可以使用BeginUpdate和EndUpdate方法来加速重新绘制列表框。当调用BeginUpdate时,列表框中的任何挂起的绘制都将被暂停,同样,EndUpdate将恢复绘制,这有助于使列表框看起来好像是快速将数据加载到其中并最大限度地减少添加时的绘制数量。数据
希望这有帮助, 最好的祝福, 汤姆。
答案 2 :(得分:0)
试试这个:
data = traceroute.startTrace(target, data, i);
listBox_trace.Items.Add(data.getOutput());
Application.DoEvents();
i++;
它不理想 - 迈克尔G的答案是最好的,但这可以作为一个快速解决方案。