avianrand Ответов: 3

Событие загрузки Usercontrol не срабатывает


VB.net, против 2012 года

У меня есть форма (frmParts), в которой было слишком много элементов управления. Управлять им становилось все труднее. Последние пару дней я провел, разбивая его на несколько пользовательских элементов управления (каждый с 20-30 текстовыми полями, метками, переключателями и т. д.).

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

Пользовательскими элементами управления являются ucPartsHeader, ucPartsSH, ucPartsTCD, ucPartsCH и ucPartsECD.

Когда ucPartsHeader добавляется в frmParts, срабатывает событие загрузки. Но когда добавляются другие 4, Их события загрузки не срабатывают. Я снова и снова перебирал код. Я не могу понять, что случилось. Я сделал переопределение событий загрузки, и это тоже не работает. Он просто никогда туда не попадет.

Кажется, что срабатывает весь код события предварительной загрузки (например, создание бар-менеджеров, адаптеров таблиц и т. д., которые находятся на каждом UserControl).

Каждый элемент управления UserControl имеет какую-либо публичную функцию называют pubfncLoadData.

Что я уже пробовал:

Вот мой код, который запускается в событии загрузки frmParts:

Dim sqlWhere As String = " WHERE PartID = " & Me.partID.ToString
Me.pvtfncLoadData(sqlWhere)

'These 3 lines run perfectly and do what I expect them to do
Dim ucPH As New ucPartsHeader
Me.pnlHeader.Controls.Add(ucPH)
ucPH.pubfncLoadData(sqlWhere)

Dim ucSH As New ucPartsSH '<<< This line runs fine
Me.pnlSH.Controls.Add(ucSH) '<<< This line seems to run fine but actually the Load event of ucPartsSH never fires
ucSH.pubfncLoadData(sqlWhere) '<<< Then when it gets here, it crashes because it needs the Load event to run first

'The same is true for the next 3 blocks of code (they don't work right)
Dim ucTCD As New ucPartsTCD
Me.pnlTCD.Controls.Add(ucTCD)
ucTCD.pubfncLoadData(sqlWhere)

Dim ucCH As New ucPartsCH
Me.pnlCH.Controls.Add(ucCH)
ucCH.pubfncLoadData(sqlWhere)

Dim ucECD As New ucPartsECD
Me.pnlECD.Controls.Add(ucECD)
ucECD.pubfncLoadData(sqlWhere)


Код события load для каждого из 5 элементы управления UserControl, практически идентичен. Но он просто не попадает туда даже для 4-х пользовательских элементов управления.

У меня есть блоки Try/Catch во всем этом, поэтому он публикует ошибки в файл журнала и продолжает работать. Форма будет создана, и появятся пользовательские элементы управления. Но в UserControls нет данных из-за того, что каждое из их событий загрузки не выполняется.

Я знаю, что кто-то захочет увидеть здесь гораздо больше кода, чтобы иметь возможность помочь. Я просто начинаю здесь сейчас, чтобы посмотреть, есть ли у кого-нибудь какое-либо представление о том, как я создаю и добавляю UserControls в основную форму. Поскольку все они почти одинаковы, я не понимаю, почему первый работает, а другие-нет. Я прокомментировал первый из них, чтобы посмотреть, позволит ли это работать второму. Но это не помогло. 2-й, 3-й, 4-й и 5-й вообще не работают, даже если первый закомментирован. Это мой первый раз, когда я использую UserControls, чтобы организовать вещи немного лучше. Может быть, я упускаю что-то очевидное.

Спасибо,

Один.

3 Ответов

Рейтинг:
2

avianrand

Да. Я думаю, что вы, возможно, правы. Думаю, я только что пришел к такому же выводу. Я потратил час, кропотливо удаляя по одному элементу управления за раз из UserControl, чтобы увидеть, какой из них был оскорбительным. Даже после того, как я удалил их все, я все равно получил ту же ошибку. Первый, который запускается, тот, который работает, отображается сразу же, потому что он находится в верхней части frmParts. Остальные 4 находятся во 2-й вкладке элемента управления 8 tab tab, и они изначально скрыты от глаз.


Рейтинг:
1

phil.o

Просто предположение: Возможно, вам придется активировать панель, к которой добавлен соответствующий элемент управления, чтобы запустить его событие загрузки.
элемент управления UserControl.событие Load[^]
Пример:

Dim ucSH As New ucPartsSH
Me.pnlSH.Controls.Add(ucSH)
Me.pnlSH.Select()
ucSH.pubfncLoadData(sqlWhere)
.. и так далее для других панелей.

Надеюсь, это поможет.


Рейтинг:
0

avianrand

Что было то было. Спасибо. Я знал, что у кого-то есть некоторое представление об этом. Я действительно ценю это. Я никогда не ожидал, что они не будут "загружаться" через код, который у меня уже был. Я исправил это, активировав вкладку, на которой находятся эти 4 UC, а затем активировав первую вкладку в элементе управления вкладками. Рад, что решил эту проблему, прежде чем уйти на целый день. Спасибо снова.


phil.o

Добро пожаловать :)
Пожалуйста, не отвечайте на решение другим решением. Я не был уведомлен о ваших ответах, так как вы не использовали "есть вопрос или комментарий?" кнопка.
И, пожалуйста, отметьте свой вопрос как ответ, если это уместно.
Любезно.