我正在FileTransfer上做一个项目,我有一个listview,我将从我的一个类文件中获取事件来更新到目前为止发送的文件的百分比,收到它后我会将百分比放在我的listview中,同时这样做了listview 一个闪烁的效果如何避免it.i使用application.doevents()但它不起作用。我已经在种子中看到了更新百分比时列表没有闪烁 如何实现这一点。
void Sender_Progress(int CurrentValue, string Ip) // here im receiving Events
{
try
{
//if (CurrentValue == 1)
// UpdateTimer.Enabled = true;
//list_send.Items[CurrentValue].SubItems[4].Text = Ip.ToString();
//Application.DoEvents();
obj = new object[] {CurrentValue, Ip };
list_send.Invoke(new UpdateList(UpList), obj);
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}
public void UpList(int Val, string ind) // here im updating the listview
{
Application.DoEvents();
int index = 0;
index = Convert.ToInt32(ind);
index = index - 1;
list_send.Items[index].SubItems[4].Text = Val.ToString();
if (Val == 100)
{
list_send.Items[index].SubItems[2].Text = "Completed.";
//UpdateTimer.Enabled = false;
}
//Application.DoEvents();
}
答案 0 :(得分:2)
首先,您不需要DoEvents
,因为您已经正确地处理了两个线程。删除它。在那之后,我预计问题只是做得太快太快了。是否可以批量更新,并且只发送更新,比如每20个更新一次? 50?次?目前还不清楚控件是什么,但很多都有多种更新模式;例如ListView
:
theList.BeginUpdate();
try {
// make multiple updates here...
} finally {
theList.EndUpdate();
}
然后我会看到关于更新的列表,例如,每20次(除非每次花费相当长的时间)[注意它必须是每个Invoke
不同的列表,并且你需要记住最后发送任何剩余的项目。
答案 1 :(得分:0)
使用工作线程 - 它可以从工具箱中获得,并且有两个在主(UI)线程中调用的事件。
Progress事件可用于表示需要刷新的列表框或任务已完成。
答案 2 :(得分:-1)
我成功地克服了闪烁效果,我经常获取事件,我将每次都得到一个整数,我将它存储在一个变量中并将它与事件接收的下一个变量进行比较如果它匹配我不会调用listview,否则我会调用它。现在闪烁消失了。谢谢大家。