Как исправить список Excel, который не может прокрутить последний элемент в поле зрения


Убийственная проблема, с которой я сталкивался в excel UIs с тех пор, как я помню, - это прокрутка списка.

Когда в списке появится больше элементов, которые можно отобразить,появится панель scoll. Однако при определенных условиях, прокручивая полосу до самого низа списка и отпуская ее, вы "прыгнете" полосу немного вверх, и вы не сможете увидеть последний пункт в списке. Это иллюстрируется здесь: Не могу прокрутить весь путь вниз

Есть много сообщений на форуме, представляющих это проблема, и решение всегда было " установите свойство integral height в false, а затем снова установите его в true."То, что это делает, немного изменяет размер списка, так что его высота округляется до высоты одной строки, и тогда никакие элементы не остаются скрытыми.

With lstbox
    .IntegralHeight = False
    .Height = myHeight
    .IntegralHeight = True
End With
Однако есть некоторые случаи, когда это не работает. Если вы:
  1. программная установка высоты вашего списка
  2. не с помощью простого выбора списка (fmMultiSelectSingle)

Затем просто установите integral height в false, а затем true после или между изменениями высоты внесет коррективы в высоту вашего списка, но когда вы перейдете к прокрутке вниз, проблема останется - последний элемент не будет виден.

Ключ к этому разочаровывающему вопросу заключается в том, что в то время как все остальные в интернете подтверждают, что решение "integralHeight" работает для них, эти очень частные случаи разочарованы, задаваясь вопросом, почему это не так работать на них. Так как же они получают свою дозу?
9 12

9 ответов:

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

Когда .Метод IntegralHeight, показанный выше, не работает, следующий метод как-то делает:

With lstbox
    .IntegralHeight = False
    .Height = myHeight
    .IntegralHeight = True
    .MultiSelect = fmMultiSelectSingle
    .MultiSelect = fmMultiSelectExtended
End With

Простым изменением .MultiSelect свойство fmMultiSelectSingle, а затем восстановить его обратно в нужный стиль выделения, высота списка будет автоматически скорректирована .IntegralHeight свойство немного отличается от высоты, когда эти действия не выполняются-разница приводит к тому, что полоса прокрутки работает правильно:

Обходной путь работал

Я надеюсь, что открытие этого особого случая и более точный обходной путь сэкономят кому-то часы. мне пришлось пройти через разочарование и эксперименты.

Мне пришлось закрепить позицию, так как мой список шел по странице:

With ListBox1 
 .IntegralHeight = False
 .IntegralHeight = True
 .Height = 45
 .Width = 69
 .Top = 0
 .Left = 1255.5
End With

В моем случае решение было таким методом:

with listbox
   .IntegralHeight = False
   .Height = myHeight
   .Width = myWidth
   .IntegralHeight = True
   .Height = myHeight
   .Width = myWidth
end with

Наслаждайтесь.

With lstbox

`.Height = myHeight`
`.MultiSelect = fmMultiSelectExtended`
`.MultiSelect = fmMultiSelectSingle`

End With

Это сработало для меня. Нет необходимости устанавливать интегральное свойство высоты

Нашел до смешного простой способ решить эту проблему. отрегулируйте свою высоту вверх или вниз немного так, чтобы нижняя строка списка была между флажками, тогда вы можете прокрутить вниз до последнего элемента, даже если IntegralHeight установлен в false

Спасибо, Ален. Твоя доза хорошо сработала для меня.

Я обнаружил последующую проблему, связанную с высотой списка при изменении размера, что она изменялась непредсказуемым образом в зависимости от начальной высоты. При отображении на другой машине с масштабированием текста на 125% высота изменения размера снова отличалась. Например, если я установлю высоту между 358 и 370, то на моем компьютере она будет равна 370,65 или 371,4, а на компьютере со 125% масштабированием текста-360,1, 370,25 или 380,45. При такой большой вариабельности результатом было то, что список мог скрывать другие элементы управления под ним.

Исправление состояло в том, чтобы начать с максимальной высоты, которую я хотел, и уменьшить начальную высоту до тех пор, пока измененная высота не будет меньше максимальной высоты, которую я хотел. Я делаю это всякий раз, когда показываю этот список.
    Hmax = 372      'Target Height 
    H1 = Hmax
    With SteelForm.Controls.Item("ListBox1")
        Do
            H1 = H1 - 1
            .IntegralHeight = False
            .Height = H1
            .IntegralHeight = True
            .MultiSelect = fmMultiSelectSingle
            .MultiSelect = fmMultiSelectExtended
            DoEvents
        Loop Until .Height < Hmax
    End With

Я знаю, что это очень старый пост. но я прошел через многое, чтобы решить эту проблему, поэтому я просто хочу поделиться своим советом. :)

Прежде всего, метод integralheight не работает, когда уровень масштабирования листа не равен 100%.

Он изменит высоту и ширину списка, расположение и т. д. (даже если вы задаете свойство object 'не перемещается и не повторяется с ячейкой')

И когда вы пытаетесь взять его исходный размер и местоположение с кодом, чтобы исправить это, на этот раз его последний элемент не может быть видел

Мой совет прост. существует комбинация между размером шрифта и высотой списка.

Если размер шрифта 6-10 (arial, regular), высота списка хорошо сочетается с кратными 12.75 (кстати, мой стиль списка-1 : ListStyle, 1-fmListStyleOption. это может быть по-другому со стилем 0)

Пока высота одинакова с этими кратными 12.75, не будет никаких проблем.

В случае размера шрифта 12 (arial, regular), он кратен 13.55

Так что если нет изменение размера списка в вашем проекте, просто немного изменив его в зависимости от размера шрифта, дает больше комфорта. :)

То, что я видел в прошлом на форумах, - это просто добавление дополнительной пустой строки в ваш список. Этого должно хватить.

Просто установите свойство Integral Height в True