为什么这段代码在Windows 7上可以运行,但在Windows XP上不能运行?

7

一些背景信息:我之前使用WPF,现在正在将我的应用程序迁移到WinForms。

我的一个朋友告诉我,我的代码在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中,我可以通过将e.Handled设置为“true”来手动处理这种情况,而在WinForms中,显然没有这样的东西。

是否有某种编译器标志可以解决这个问题?


据我所知,您将不得不自己编写标志。 - lc.
5
我从未听说过有人从WPF迁移到WinForms!公正地说。 - MoonKnight
1
有谁会想从WPF转到Winforms呢? - PhonicUK
1
@Killercam 哈哈,我花了两年时间从WinForms迁移到WPF,它太复杂了,但你知道在组合框中使用进度条让它变得非常酷。 - EaterOfCode
@Kuraj 是的,它可以运行,但是它已经不再受支持了,就像XP一样,虽然仍然可用,但不再得到支持。 - EaterOfCode
显示剩余7条评论
3个回答

4

试试这个:

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

您只需要在第一个项目上设置选择一次。问题是它可能会陷入永久循环。

至于为什么Windows 7比XP更容易处理,我无法说。可能是LVM_*消息处理的顺序或其他任何原因。


是的,但添加/删除事件有点昂贵/极端 :) - Lloyd
我知道,但对于很多人来说这是新鲜事物,我没有以那种方式考虑过。 - EaterOfCode
我想这个解决方法非常简单明了 :) 话虽如此,我已经知道bug为什么出现了。我只是担心行为上的不同之处。 - Kuraj

2
检查一下.NET版本是否有所不同。如果你的Windows 7机器上有比XP更新的.NET版本(很可能是这样),即使你针对早期版本进行定位,也可能存在差异。
请参考MSDN关于.NET向后兼容性的说明

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


哈哈。这使得XP的行为就像7一样,但现在7的行为更加不同了。这到底是怎么回事... :) - Kuraj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接