Высота полосы прокрутки в кадре пользовательской формы не обновляется сразу. Мне нужно нажать на нее, чтобы обновить - PullRequest
1 голос
/ 15 мая 2019

Итак, у меня есть пользовательская форма Excel, которая содержит фрейм . В этом кадре может быть X количество динамически добавляемых объектов, которые заполняют его содержимое, пока оно не переполнится. Конечно, я добавил вертикальную полосу прокрутки , чтобы компенсировать эту проблему, это не проблема.

Нижняя рамка с надписью "Données" - это та, о которой я говорю: The bottom frame with caption

Проблема гораздо сложнее. Итак, как вы можете видеть на предыдущем изображении, есть несколько кнопок (на самом деле кнопки переключения). Когда вы переключите набор каждого из них, они появятся в рамке ниже. Фактически, будут показаны все возможные комбинации переключаемых кнопок.

Пример 1: Example 1

Пример 2: Example 2

Методы нажатия кнопок переключения фактически запрограммированы в модуле класса, который вызывает подпрограмму непосредственно в пользовательской форме (с именем RSAjout2).

Option Explicit

'THIS PIECE OF CODE IS WRITTEN IN A CLASS-MODULE

' Is not useful for this demonstration
Public WithEvents btn As MSForms.ToggleButton
Public frm As UserForm
'''


' Here, each button is an object that calls the refreshData function to make sure it is updated each
' time one of then is pressed

Private Sub btn_Click()
    'We call the subprocedure in the userform RSAjout2
    RSAjout2.refreshData
End Sub

Когда вызывается эта подпрограмма (обновить данные), есть часть ее кода, которая регулирует высоту полосы прокрутки.

Public Sub refreshData()

'###Lots of code that I dont have any problem with###

    RSAjout2.CadreDonnees.ScrollHeight = totalHeight
    'Where totalHeight is just the height of all the frames stacked in the big frame


End Sub

И это тоже отлично работает. (Так в чем же проблема?)

Проблема в том, что , когда код на самом деле изменяет высоту полосы прокрутки, он фактически не обновляется! Мне нужно либо нажать на саму полосу прокрутки (и переместить ее), чтобы она изменила форму или нажмите другую кнопку toggleButton (но ее состояние является старым). Позвольте мне показать вам фотографии.

Если я сделаю комбинацию тестов и носителей, чтобы число кадров заполнило кадр контейнера, оно должно отображать полосу прокрутки вправо (ну, а его высота должна обновляться)?

Неправильно: Wrong

Затем, если я щелкну полосу прокрутки и переместу ее так, как она уже существовала, она неожиданно обновит ее, теперь она видна.

Почему? Why?

Это происходит только с моими кнопками переключения. Если я, например, использую кнопку «Abondonner», чтобы изменить высоту полосы прокрутки, она работает отлично. Почему это так?

Private Sub Abandonner_Click()
    'Code to test if the scrollbar updates normally from a normal click procedure
    Me.CadreDonnees.ScrollHeight = 1000
    'Spoiler* It works perfectly
End Sub

РЕДАКТИРОВАТЬ: Это, казалось, сделал трюк. Однако это явно не лучший способ решить эту проблему. Ну, по крайней мере, это работает ...

    'An aweful, but working solution
    CadreDonnees.ScrollTop = 1
    CadreDonnees.ScrollTop = 0
    CadreDonnees.ScrollHeight = totalHeight
    CadreDonnees.ScrollTop = 1
    CadreDonnees.ScrollTop = 0

1 Ответ

0 голосов
/ 16 мая 2019

Попробуйте вызвать метод Repaint вашего элемента управления Frame =)

CadreDonnees.Repaint
...