Как вызвать метод в UserControl после его показа? - PullRequest
15 голосов
/ 12 января 2011

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

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

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

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

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

1 Ответ

19 голосов
/ 12 января 2011

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

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

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

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

    if (Visible && !Disposing) PopulateGridView(); //<-- your population logic
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...