Подтвердить что ты не робот

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

У меня многослойная форма, на левой панели - дерево, а в правой панели - панель. Выбор дерева приводит к тому, что определенные пользовательские элементы управления загружаются на Panel. В этом случае, поскольку родительская форма всегда загружается, я не могу подключиться к родительской форме. Событие Shown.

В большинстве моих UC есть несвязанный DataGridView, который должен быть заполнен при создании UC. Время от времени может быть добавлено 50 000 строк, из базы данных SQL Server.

До сих пор я заполнял сетки во время конструктора UC, но так как мы начали работать с 50 000 строк, все изменилось. Я обнаружил, что заполнение сетки 50 000 строк от конструктора занимает не менее 15 минут по какой-то сумасшедшей причине. Однако, если я жду, чтобы заполнить сетку, пока я не нажму кнопку или из события загрузки, это займет 15 секунд. Это тайна. Поэтому я пытаюсь переместить загрузку сетки в другое место.

Однако, когда я пытаюсь заполнить сетку из события Load, есть визуальные несоответствия. Что произойдет, вы видите, что появляется небольшая версия моего UC, для загрузки строк DGV требуется 15 секунд, а ТОЛЬКО UC расширяется, чтобы заполнить панель (для свойства UC Dock установлено значение Fill). Поэтому мне не нравится этот вариант.

Событие Shown будет идеальным местом для загрузки моей сетки, если оно существует для UC. Кто-нибудь знает о другом способе сделать это?

4b9b3361

Ответ 1

Мой ответ на аналогичную проблему состоял в том, чтобы заполнить DGV, когда сетка стала видимой. В этом суть ленивой нагрузки; получить информацию в последнюю возможную секунду.

Захват в VisibleChanged, который будет срабатывать, когда ваш элемент управления вызывает Show() или Hide(), или свойство Visible, заданное вручную. Если поле в настоящее время видимо, И элемент управления не находится в процессе закрытия или удаления (потому что для некоторых причудливых причин элементы управления могут стать видимыми в этом случае), выполните вашу совокупность сеток.

Здесь необходим обработчик, очень простой:

protected override void OnVisibleChanged(EventArgs e)
{
    base.OnVisibleChanged(e);

    if (Visible && !Disposing) PopulateGridView(); //<-- your population logic
}