Приложение Winform, принудительно запускает событие OnLoad, когда фокус находится на другой вкладке

1

У меня есть приложение WinForm, форма имеет TabControl, элемент управления имеет три вкладки tabPage1, tabPage2, tabPage3.

На вкладке TabPage3 находится пользовательский элемент управления, который имеет один или несколько дочерних элементов управления. Теперь моя проблема заключается в tabPage3, я знаю, что это чистое поведение Winforms, пока ваш родитель не активирует дочерние элементы управления. Событие Onload не срабатывает. У меня есть требование принудительно вызвать событие Onload, когда фокус находится на tabPage1, tabPage2. Есть ли способ принудительно запустить событие Onload.

Я уже посетил следующие ссылки, но не нашел подсказки. Ссылка на Link Link

  • 0
    Элементы управления TabPage3 не будут инициализированы, пока вы не нажмете на них. Почему бы вам не сохранить UserControl в Program.cs и получать к нему доступ в любое время.
  • 0
    Я нахожусь в ситуации Usercontrol из другой библиотеки, я могу изменить библиотеку, но я не могу изменить дизайн. Поскольку библиотека используется многими клиентами.
Теги:
winforms

2 ответа

2

Это очень необычное требование, сильно пахнет проблемой XY. Событие Load сильно переработано в Winforms, побочным эффектом которого является событие по умолчанию для формы или UserControl. Одним из поведений, унаследованных от VB6, событие Load было большой проблемой на этом языке. То, что вы хотите, может быть легко достигнуто, не предоставив Winforms выбор:

    public UserControl3() {
        InitializeComponent();
        CreateHandle();
    }

Вызов CreateHandle() вызывает принуждение, OnLoad будет немедленно запущен. Но имейте в виду, что это происходит очень рано, слишком рано делать то, что вы действительно хотите использовать OnLoad() или событие загрузки для. Что довольно ограничено, действительно необходимо найти фактическое местоположение и размер элемента управления. Все остальное принадлежит конструктору. Конечно, включая код, который вы теперь используете в OnLoad().

Сильно пользуйтесь вместо этого конструктором.

0

У меня была аналогичная проблема для предыдущего проекта, для моих нужд мне удалось просто перебрать каждую вкладку в конструкторе форм (или, возможно, OnLoad, которую я не помню), а затем вернуть индекс обратно до 0, прежде чем показывать конечного пользователя,

Что-то подобное:

for(int i = 1; i < tabControl.TabCount; i++)
    tabControl.SelectTab(i);
tabControl.SelectTab(0);
  • 0
    Я не могу сделать это, проблема, с которой я сталкиваюсь, заключается в нажатии кнопки закрытия tabPage1, tabPage2. Я не думаю, что это хорошая идея, чтобы загрузить все элементы управления каждой вкладки (1 ... 10). Мне нужно только дочерние элементы управления tabPage3 для инициализации.
  • 0
    Это действительно единственное решение, если вы не можете принудительно / гарантировать, что конечный пользователь сначала выберет вашу вкладку. Вы можете просто загрузить вкладку 3 самостоятельно ( SelectTab(2) )

Ещё вопросы

Сообщество Overcoder
Наверх
Меню