【问题标题】:Why does this code work on Windows 7, but doesn't on Windows XP?为什么此代码在 Windows 7 上有效,但在 Windows XP 上无效?
【发布时间】:2012-09-20 06:16:08
【问题描述】:

一点背景知识:我是 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 我可以通过在 WinForms 中将 e.Handled 设置为“true”来手动处理此类行为显然没有这样的东西。

是否有某种编译器标志?

【问题讨论】:

  • 你必须滚动你自己的标志 AFAIK
  • 我从未听说过有人从 WPF -> WinForms 迁移!公平竞赛。
  • 您运行的是哪个版本的 .NET?通过在 W7 上安装 4.5 修复了 4.0 中的一些错误,但您不能在 XP 上做同样的事情。 (我怀疑是这样,但你永远不知道。)
  • 为什么会有人 WPF转到Winforms?
  • @Killercam 哈哈,我花了 2 年时间从 WinForms 迁移到 WPF,它太复杂了,但你知道组合框中的进度条让它变得如此酷

标签: c# .net windows winforms listview


【解决方案1】:

检查 .NET 版本是否有任何不同。如果您的 Windows 7 计算机上的 .NET 版本比 XP 上的新版本(很可能),那么即使您针对的是较早版本,也可能存在差异。

看看MSDN says about .NET backwards compatibility是什么。

【讨论】:

    【解决方案2】:

    这可能有效(未测试)

    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 的行为更加不同。这里到底是什么交易...... :)
    【解决方案3】:

    试试这个:

    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_* 消息的处理顺序或其他任何内容。

    【讨论】:

    • 是的,但是添加/删除事件有点昂贵/极端:)
    • 我知道,但这对很多人来说都是新事物,我没想到会这样
    • 我想这个解决方法是最直接的 :) 就是说,我已经知道为什么会出现这个错误。我只担心不同的行为部分。
    猜你喜欢
    • 2014-02-06
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 2012-06-09
    • 1970-01-01
    • 2022-10-19
    • 1970-01-01
    相关资源
    最近更新 更多