更改 ListView.ShowItemToolTips 引发 ItemChecked 事件

Changing ListView.ShowItemToolTips raises ItemChecked events

嗨,当我在设计器中将带有复选框项目的 ListViewShowItemToolTips 设置为 true 并在代码中将其更改为 false 时,事件 ItemChecked 被提出。选中状态本身并没有改变。但是在(同样引发的)ItemCheck 事件中,旧值不等于新值,但新值是之前可见的值。似乎以某种方式重新插入或重置了项目。

我在两台机器和项目上对此进行了测试。为什么会发生这种情况,我该如何避免?

我将解释 "why",很难找到解决方法。某些控件属性影响很大,更改它们时可能会产生奇怪的副作用。与 ShowItemToolTips 一样,在创建 ListView 后更改它需要 Winforms 完全销毁本机控件并从头开始重新创建它。在幕后,它是在 CreateWindowEx() 调用中指定的样式标志 (LVS_EX_INFOTIP)。 Control.RecreateHandle() 方法确保它是有效的。如果你仔细观察,你会看到这导致的闪烁。

所以在短时间内,本机控件存在,但尚未使用原始复选框状态进行初始化。为此获得不稳定的事件是一个错误,但这种错误要么从未被修复,因为这样做太困难了,要么从未被发现,因为在创建控件后没有人更改 ShowItemToolTips 属性。很少见。

总的来说,这种重新创建本机控件的技巧一直是 Winforms 中的一个重要错误生成器。解决方法很难找到,它们属于 "deal with it" 或 "don't do it" 类别。在这种情况下强烈推荐使用后者。