[解决,下面。发表以防其他人有这个问题。]
我有一个带有datarepeater的表单(' DR'今后)显示多行。 DR中的一个控件是一个复选框。当用户单击其中一行中的ckeckbox时,该行将成为当前记录,将引发Checkbox_click事件,并且该事件处理程序中的代码使用DR.CurrentItemIndex来处理当前记录。
当表单是Windows活动表单(具有焦点)时,这非常有效。将鼠标悬停在一个复选框(不是当前项目)上,它会变为蓝色,单击它,它的行变为当前,并且复选框会切换。
当窗体不是Windows活动窗体时,会出现问题。例如,单击桌面,然后将鼠标悬停在表单上的复选框(而不是当前项目)上,然后单击,DR CurrentItemIndex不会更改。
我已经跟踪了一些引发的事件,看看会发生什么。 在这里,' a'是当前项目,点击行' b'复选框:
如果表格有焦点:
1. Checkbox Hover (prior to click)
2. DR DrawItem (a)
3. DR DrawItem (b)
4. DR CurrentItemChanged (to b)
5. Checkbox click
如果表格没有焦点:
1. CheckBox Hover (prior to click)
2. Form activated
3. Checkbox click
永远不会引发DR CurrentItemIndexChanged事件。
因为Checkbox_click处理程序中的代码使用DR.CurrentItemIndex,所以在上面的第二种情况下,它使用了错误的索引,因此程序出现故障。
如何让DR一致行动?或者,作为一种解决方法,Checkbox_click处理程序如何获得正确的ItemIndex?
[解决] 在ck_MouseHover事件处理程序中:
Me.Focus
(这么简单的解决方案花了这么长时间!)