Публикация

Как избавиться от передергиваний контролов в окне?

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

Дело в том, что у сервиса окна есть два замечательных метода, BeginUpdate() и EndUpdate(), которые и следует использовать для "замораживания" контролов.

В качестве примера возьмем карточку редактирования "Контрагентов". Опишу немного реализацию: для контрола edtAccountType на его метод OnPrepareSelectWindow вешаем вызов BeginUpdate() (т.е. на инициацию клика по контролу), а на метод датасетлинка dlDataOnDatasetDataChange - EndUpdate() (т.е. EndUpdate должен отработать после того, как выбрано значение в лукап-контроле). Кроме того, следует помнить: чтобы OnPrepareSelectWindow отрабатывал всегда, когда мы будем кликать по контролу типа контрагента необходимо вызывать его метод UnPrepareDropDownList().

А теперь сам код:

function wnd_AccountEditOnPrepare(Window) {
        Initialize();
        wnd_BaseDBEditOnPrepare(Window);
        edtAccountType.UnPrepareDropDownList();
}

function edtAccountTypeOnPrepareSelectWindow(LookupDataControl, SelectWindow) {
    Self.BeginUpdate();
}

function dlDataOnDatasetDataChange(DataField) {
    if (DataField.Name == 'AccountTypeID') {
        Self.EndUpdate();
        edtAccountType.UnPrepareDropDownList();  
    }
}

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

Нравится

Поделиться

4 комментария

Извини, что-то я не совсем понимаю суть идеи. Что именно ты добился в этом примере?

На PrepareSelectWindow делаем BeginUpdate, а после того, как значение выбрано, делаем EndUpdate. В результате этого при отрисовке пользовательских полей (что вызывает обычно передергивания) окно на этот момент , так сказать, "замораживается". Попробуй добавить с десяток пользовательских полей для разных типов контрагентов и сравни эффект без подобного кода и с ним.

Если таким образом можно избавится от передёргивания окна - в базовую версию надо добавлять.

Исправил в ядре: 3.3.2.39.

Показать все комментарии