Datarepeater не всегда вызывает событие CurrentItemIndexChanged
[Решено ниже. Опубликовано в случае, если у кого-то еще есть эта проблема.]
У меня есть форма с ретранслятором данных (далее "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
(Так много времени ушло на такое простое решение!)