更改 ListView.ShowItemToolTips 引发 ItemChecked 事件
Changing ListView.ShowItemToolTips raises ItemChecked events
嗨,当我在设计器中将带有复选框项目的 ListView
的 ShowItemToolTips
设置为 true
并在代码中将其更改为 false
时,事件 ItemChecked
被提出。选中状态本身并没有改变。但是在(同样引发的)ItemCheck
事件中,旧值不等于新值,但新值是之前可见的值。似乎以某种方式重新插入或重置了项目。
我在两台机器和项目上对此进行了测试。为什么会发生这种情况,我该如何避免?
我将解释 "why",很难找到解决方法。某些控件属性影响很大,更改它们时可能会产生奇怪的副作用。与 ShowItemToolTips 一样,在创建 ListView 后更改它需要 Winforms 完全销毁本机控件并从头开始重新创建它。在幕后,它是在 CreateWindowEx() 调用中指定的样式标志 (LVS_EX_INFOTIP)。 Control.RecreateHandle() 方法确保它是有效的。如果你仔细观察,你会看到这导致的闪烁。
所以在短时间内,本机控件存在,但尚未使用原始复选框状态进行初始化。为此获得不稳定的事件是一个错误,但这种错误要么从未被修复,因为这样做太困难了,要么从未被发现,因为在创建控件后没有人更改 ShowItemToolTips 属性。很少见。
总的来说,这种重新创建本机控件的技巧一直是 Winforms 中的一个重要错误生成器。解决方法很难找到,它们属于 "deal with it" 或 "don't do it" 类别。在这种情况下强烈推荐使用后者。
嗨,当我在设计器中将带有复选框项目的 ListView
的 ShowItemToolTips
设置为 true
并在代码中将其更改为 false
时,事件 ItemChecked
被提出。选中状态本身并没有改变。但是在(同样引发的)ItemCheck
事件中,旧值不等于新值,但新值是之前可见的值。似乎以某种方式重新插入或重置了项目。
我在两台机器和项目上对此进行了测试。为什么会发生这种情况,我该如何避免?
我将解释 "why",很难找到解决方法。某些控件属性影响很大,更改它们时可能会产生奇怪的副作用。与 ShowItemToolTips 一样,在创建 ListView 后更改它需要 Winforms 完全销毁本机控件并从头开始重新创建它。在幕后,它是在 CreateWindowEx() 调用中指定的样式标志 (LVS_EX_INFOTIP)。 Control.RecreateHandle() 方法确保它是有效的。如果你仔细观察,你会看到这导致的闪烁。
所以在短时间内,本机控件存在,但尚未使用原始复选框状态进行初始化。为此获得不稳定的事件是一个错误,但这种错误要么从未被修复,因为这样做太困难了,要么从未被发现,因为在创建控件后没有人更改 ShowItemToolTips 属性。很少见。
总的来说,这种重新创建本机控件的技巧一直是 Winforms 中的一个重要错误生成器。解决方法很难找到,它们属于 "deal with it" 或 "don't do it" 类别。在这种情况下强烈推荐使用后者。