为什么此代码适用于Windows 7,但不适用于Windows XP?

时间:2012-09-28 10:57:53

标签: c# .net windows winforms listview

一点背景:我是WinForms转换器的WPF,有一段时间我一直在迁移我的应用程序。

我的朋友报告说我的代码在Windows XP上不起作用(它在启动时会产生堆栈溢出),即使它在Windows 7(我开发的)上工作正常。

经过一番研究后,导致问题的原因是:

 private void listView1_SelectedIndexChanged(object sender, EventArgs e)
 {
     listView1.SelectedIndices.Clear();
     listView1.Items[0].Selected = true;
 }

现在我注意到了明显不好的决定,我不知道为什么它在Windows XP上不起作用。我想知道为什么它适用于Windows 7

显然,在某些时候,编译器会弄清楚我正在尝试做什么并阻止同一事件一次又一次地被触发,但是我宁愿让它什么都不做,所以我可以看到在我正在开发的平台上看到错误,而不是必须同时在两个平台上测试它。回到WPF我可以通过在WinForms中将e.Handled设置为'true'来手动处理这种行为显然没有这样的事情。

是否有某种编译器标志?

3 个答案:

答案 0 :(得分:4)

试试这个:

private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
   if (!listView1.Items[0].Selected) {
       listView1.SelectedIndices.Clear();
       listView1.Items[0].Selected = true;
   }
}

您只想在第一个项目上设置选择ONCE。问题是它可能会进入永久循环。

至于为什么Windows 7比XP更宽容,我不能说。可以是处理LVM_ *消息的顺序。

答案 1 :(得分:2)

检查并查看.NET版本是否有任何区别。如果你的Windows 7机器上的.NET版本比XP上的版本(很可能),那么即使你的目标是早期版本,也可能存在差异。

查看MSDN says about .NET backwards compatibility

答案 2 :(得分:1)

这可能有效(未经测试)

private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
   if(Environment.OSVersion.Version.Major < 6) listview1.SelectedIndexChanged -= new EventHandler(listView1_SelectedIndexChanged);
   listView1.SelectedIndices.Clear();
   listView1.Items[0].Selected = true;
   if(Environment.OSVersion.Version.Major < 6) listview1.SelectedIndexChanged += new EventHandler(listView1_SelectedIndexChanged);
}

编辑查看其特定的操作系统:o