Winforms 更改ListView.ShowItemToolTips会引发ItemChecked事件

Winforms 更改ListView.ShowItemToolTips会引发ItemChecked事件,winforms,listview,events,event-handling,Winforms,Listview,Events,Event Handling,嗨,当我在designer中将带有复选框项的列表视图的ShowItemToolTips设置为true,并在代码中将其更改为false时,将引发事件ItemChecked。但选中状态本身不会更改。但是在(也被提升)ItemCheck事件中,旧值不等于新值,但新值是以前可见的值。这些项目似乎以某种方式被重新插入或重置 我在两台机器和两个项目上对此进行了测试。为什么会发生这种情况?我如何避免它?我将解释“为什么”,解决方法很难找到。某些控件属性非常有影响,更改它们时可能会产生奇怪的副作用。与ShowI

嗨,当我在designer中将带有复选框项的
列表视图的
ShowItemToolTips
设置为
true
,并在代码中将其更改为
false
时,将引发事件
ItemChecked
。但选中状态本身不会更改。但是在(也被提升)
ItemCheck
事件中,旧值不等于新值,但新值是以前可见的值。这些项目似乎以某种方式被重新插入或重置

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

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

因此,在很短的一段时间内,本机控件还没有使用原始复选框状态进行初始化。获取一个不稳定的事件是一个bug,但它要么因为太难而从未被修复,要么因为创建控件后没有人更改ShowItemToolTips属性而从未被发现。这样做是非常罕见的


一般来说,这种本机控件重新创建技巧在Winforms中一直是一个重要的bug生成器。解决办法很难找到,它们要么属于“处理它”,要么属于“不做它”。在这种情况下,强烈建议使用后一种方法。

使用MessageBox.Show在ItemChecked事件处理程序中进行了快速测试,当MessageBox显示时,ListView似乎已从表单中消失。此外,仅当至少选中一个复选框时才会激发事件。True。必须检查一项。我猜这是一种在后台重置的项目。但是这些副作用难道不应该被记录下来吗?我的意思是我只是设置了一个布尔属性。谢谢你的解释。我是这么想的。是的,在运行时更改
ShowItemToolTips
是很少见的。这可能就是我对这种行为一无所知的原因。