更改ListView.ShowItemToolTips会引发ItemChecked事件

时间:2015-03-20 15:20:56

标签: winforms listview events event-handling

如果我将ShowItemToolTips ListView的{​​{1}}设置为true设计器中的false并将其更改为代码中的ItemChecked,那么事件ItemCheck被提出来了。虽然检查状态本身没有改变。但是在(也引发的){{1}}事件中,旧值不等于新值,但新值是先前可见的值。看起来这些项目是以某种方式重新插入或重置的。

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

1 个答案:

答案 0 :(得分:2)

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

因此,在短暂的时间内,本机控件尚未使用原始复选框状态进行初始化。获得一个片状事件是一个错误,但它是从未修复的那种,因为这样做太困难或者从未被发现,因为在创建控件之后没有人更改过ShowItemToolTips属性。这样做非常罕见。

通常,这种本机控件重新创建技巧一直是Winforms中的重要错误生成器。很难找到解决方法,它们适合于处理它和#34;或者“不做”"类别。在这种情况下强烈建议使用后者。