2015-08-20 4 views
-1

Я работаю с windowsForm в vb.Net. У меня есть одна основная форма (frmMaster), у которой есть кнопки с левой стороны и одна панель (PanelDetail) с правой стороны. У меня есть два пользовательских элемента управления, скажем, uc1 и uc2. Когда я нажал кнопку из основной формы, она правильно открывает uc1 на панели с помощью кода ниже.Как вызвать usercontrol в форме Windows

PanelDetail.Controls.Add(uc1) 
uc1.Show() 

Существует контрольная кнопку на Uc1 и я хочу открыть UC2, когда пользователь нажимает на кнопке с Uc1. Так что я должен добавить uc2 в PanelDetail и скрыть или удалить uc1. Чтобы сделать это, я создал публичный метод в frmMaster

Public Sub DisplayControl(ControlName As UserControl) 
    PanelDetail.Controls.Clear() 
    PanelDetail.Controls.Add(ControlName) 
    ControlName.Show() 
End Sub 

и этот метод вызывается из кнопки мыши случае Uc1 вызвать UC2

frmMaster.DisplayControl(frmMaster.vuc2) 

UC2 уже объявлен как разделяемая в Основная форма, как

Public Shared vuc2 As New CtrlLeavesList 

так что, когда я нажимаю на кнопку с Uc1, она очищает uc1 от панели, но не загружает UC2.

может кто-нибудь предложить мне правильный способ сделать это.

Спасибо.

+1

Хотя законно вызывать 'formName.PublicMethod', это не значит, что вы получаете экземпляр формы.Вы можете использовать событие в UC и подписываться на форму, когда событие срабатывает, у вас есть код, выполняемый в обработчике событий, для удаления и добавления на панель другого элемента управления. – OneFineDay

ответ

0

Как сказал OneFineDay, вы можете объявить событие в uc1.

Public Event RemoveButtonClicked() 

Тогда в обработчик событий для фактической кнопки на пользовательском элементе управления (uc1), вы поднимаете событие.

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 
    RaiseEvent RemoveButtonClicked() 
End Sub 

Затем в основной форме, вы бы объявить экземпляр Uc1, и зарегистрировать ручку для события.

Public WithEvents uc1 As New CtrlLeavesList 

Public Sub uc1_RemoveButtonClicked(ByVal sender As Object, ByVal e As System.EventArgs) Handles uc1.RemoveButtonClicked 
    DisplayControl(uc2) 
End Sub 
+0

Спасибо за ответ и ваше время. –

+0

Я попытался выполнить шаги, но не мог понять поток. почему мне нужно объявить событие в uc2. Я не могу поднять событие в кнопке uc1, его синтаксическую ошибку и, тем самым, проблему с регистром событий в основной форме. можете ли вы отправить правильный синтаксис. Спасибо за ваши усилия –

+0

Ах да, извините, вы правы. Я сделал исправления. Дайте мне знать, если вы все еще не можете заставить его работать. – Whitey

0

Я исправил проблему, используя приведенный ниже код. Вы должны определить общественное мероприятие, как показано ниже в Uc1

Public Event RemoveButtonClicked As EventHandler 

, а затем поднять событие нажатия кнопки на Uc1

Private Sub btnApplyLeave_Click(sender As System.Object, e As System.EventArgs) Handles btnApplyLeave.Click 

    RaiseEvent RemoveButtonClicked(sender, e) 
End Sub 

Затем в основной форме, вы бы объявить экземпляр класса uc1 и зарегистрировать дескриптор события.

Public Shared uc1 As New CtrlLeavesList 
Public Shared uc2 As New CtrlApplyforLeave 

Тогда самый важный вам нужно добавить обработчик на форме нагрузки основной формы

AddHandler vCtrlLeavesList.RemoveButtonClicked, AddressOf vCtrlLeavesList_RemoveButtonClicked 

, а затем зарегистрировать событие

Public Sub vCtrlLeavesList_RemoveButtonClicked(ByVal sender As Object, ByVal e As System.EventArgs) 
    PanelDetail.Controls.Add(uc2) 
uc2.Show() 

End Sub 

Приведенный выше пример прекрасно работает для меня.

Смежные вопросы