Страницы: 1
RSS
DblClick в ListBox вызывает выделение другого элемента списка
 
Какая-то непонятка, прошу помочь разобраться.

Вызов формы - DblClick на первой строке.
На форму в  ListBox выводится список наименований столбцов (шапка таблицы). DblClick на элементе списка - соответствующий столбец на листе скрывается/отображается
Это работает.

Но при этом кавардак с выделениями в списке, хотя список каждый раз пересматривается.
Например, скрываем столбец  3 - галка на нем не ставится, но ставится на первом. Показываем третий - на нем ставится галка (хотя должа быть снята).
Если форму переоткрыть - выделены все нормально.
Код
' скрыти/отображение столбцов
Private Sub lbList_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim i As Long
    With lbList
        i = .ListIndex: If i = -1 Then Exit Sub
        If .ListCount = 0 Then Cancel = True
        
'        Application.ScreenUpdating = False
        rRng(i + 1).EntireColumn.Hidden = Not rRng(i + 1).EntireColumn.Hidden
'         Application.ScreenUpdating = True
    End With
    
'    Application.Wait Time:=Now + TimeValue("0:00:01")
    Call ChangeList ' к перезаписи списка
End Sub 

На 14 строке (вызов Call ChangeList) поставить точку  останова. Если запустить процедуру и  после остановки продолжить по F5 - список отображается корректно. Уже и задержку ставить пробовал, и  перезапись rRng  -  не помогает.
Не вижу какой-то мелочи или действительно проблема?


Полный код формы
 
Вить, а как ты отображаешь ранее скрытые столбцы?
 
Тот же  DblClick. Т.е. по двойному клику - или скрытие, или отображение.
Код
rRng(i + 1).EntireColumn.Hidden = Not rRng(i + 1).EntireColumn.Hidden

Если не смотреть на выделение в списке - работа со столбцами вопросов не вызывает.
 
Я почему спросил - у меня и с отображением проблемы.
 
Нет, со столбцами на листе проблем нет.

Интересно: если скрывать/отображать первый столбец (работать с первым элементом списка) - галка работает корректно и другие элементы не задеваются.
 
А двойной клик - это принципиально? Почему не одиночный?
 
Событие одиночного клика?
 
Да. А то как-то нелогично: можно выделить одиночным, но никакого действия не происходит - зачем тогда выделяли? )
 
Одиночный клик - это событие для запуска макроса?
Выделение одиночным кликом отключается, это не проблема.
 
Нет - клик в ЛистБоксе.
 
Так, наверное, в работе и сделаю (Change). Поначалу вариант был отклонен (нужно отключать событие на время переписывания списка)

Но вопрос остался: в чем поблема?
 
Вить, глянь вариант.
 
Спасибо )
Я точно так  (с флагом Dim, не Public) делал. Даже оптимальнее: обработку вызывал отдельно, тогда не инициализируются переменные внутри ColumnsHidden
Код
Private Sub lbList_Change()
    If bFlag = False Then Call ColumnsHidden
End Sub

Но событие все равно срабатывает каждый раз. Заходит - проверяет - уходит.
С переходом на двойной клик от этого хотел уйти. Уйти не получилось (все равно нужно отключать одинарный клик), но обнаружил проблему, которую и описал в первом сообщении.

Вот эту загадку и интересно разгадать, чтобы в будущем "предупрежден - значит, вооружен"
 
Сходу не разобрался, а потом было лень. Быстрее другой вариант написать )
 
vikttur, Вы знаете, это Ваше rRng(i + 1) смутно напоминает то, над чем я в пятницу бился. Конкретно - перебором диапазона по индексу, который у меня тоже странно работает.
 
Спасибо, надо разобраться.
 
Цитата
StoTisteg написал:  смутно напоминает  то, над чем я в пятницу бился .
В примере по ссылке в #15 нужно учесть особенности работы с диапазонами, которые содержат несколько областей (Areas)
Владимир
 
Действительно, перебор тут не при чём. И даблклик тоже. Написал с нуля по ТЗ — всё работает. Значит, мы все чего-то очевидного не видим в коде Виктора...
Изменено: StoTisteg - 10.12.2018 18:11:58
 
На моей конфигурации в #1 проставляется лишняя галочка в первой строке списка при двойном щелчке по любой строке списка, кроме первой. Возможно, это "привет" от  щелчка мышью, поскольку в начале работы макроса первый элемент списка присваивается правильно.
Изменено: sokol92 - 10.12.2018 18:34:17
Владимир
 
код похож на решение StoTisteg, но "dblclick" не хорош для этой цели
Код
Private Sub lbList_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    Dim i As Long
    With lbList
        i = .ListIndex: If i = -1 Then Exit Sub
        If .ListCount = 0 Then Cancel = True
        'rRng(i + 1).EntireColumn.Hidden = Not rRng(i + 1).EntireColumn.Hidden
        If Not .Selected(i) = Columns(i + 1).Hidden Then Columns(i + 1).Hidden = .Selected(i)
    End With
    ActiveWindow.SmallScroll ToRight:=-(i + 1)
End Sub
 
ocet p, это ясень пень, что даблклик - не идеал. Зато позволяет обновить сразу все галки, а не последовательно, как чейндж.
Цитата
ocet p написал:
If i = -1 Then Exit Sub
Блин, этого-то слона я и забыл...
 
Спасибо. Посмотрел предложенные варианты.
Отличаются, но, к сожалению,  решения вопроса так и не принесли.
Если в моем коде закомментировать Call ChangeList, тоже ошибки нет. Почему-то список пересматривается ошибочно, хотя при ручном проходе ошибки нет.
Цитата
sokol92 написал: Возможно, это "привет" от  щелчка мышью
Нет, т.к. работа ChangeList запускается после реагирования на двойной клик.

Вопрос не в самом решении здачи. Уже сделано (реагирование на Change) и забыто :)
Ошибка непонятна...
Страницы: 1
Наверх