我终于想到了一个头衔!
我有一个foreach循环,它迭代ListViewItems并对每个项目执行某些操作。但问题不在于它不能在循环中完成工作,而是它不会执行任何在foreach循环之前出现的代码。
以下是完整的方法:
private void pNGToolStripMenuItem_Click(object sender, EventArgs e)
{
stat.Text = "Converting to PNG.";
_piclist.Enabled = false;
foreach (ListViewItem item in _piclist.Items)
{
try
{
/* magical image conversion here. */
_piclist.Enabled = true;
stat.Text =
"Conversion complete.";
}
catch (Exception exception)
{
stat.Text =
exception.Message;
}
}
}
有人可以帮我理解为什么代码:
stat.Text = "Converting to PNG.";
_piclist.Enabled = false;
在foreach循环永远不会被执行之前?
由于
答案 0 :(得分:4)
确实如此。问题是你的循环体会立即覆盖之前运行的代码的结果:
stat.Text = "Converting to PNG.";
_piclist.Enabled = false;
_piclist.Enabled = true;
stat.Text =
"Conversion complete.";
您没有看到它,因为在您的方法执行时用户界面冻结,您只看到最后的更改。考虑使用线程,这里有一篇很棒的文章:http://msdn.microsoft.com/en-us/magazine/cc164037.aspx
答案 1 :(得分:3)
您是如何确认代码从未执行过的?你设置了一个断点吗?
输入foreach循环后,循环前设置的_piclist.Enabled
和stat.Text
值将被新值覆盖(true
和"Conversion complete"
。用户界面可能永远不会同时更新。
答案 2 :(得分:0)
听起来你没有用事件注册处理程序......(+ =)
马丁
聚苯乙烯。澄清 - 我说整个方法都没有被调用,因为我怀疑你没有为这个事件注册这个处理程序......