Windowsform и uercontrol, реализуя в них изменения.
Привет,
Я программирую приложение windows form, у меня возникли проблемы с реализацией кода для моих пользовательских элементов управления,
допустим, все мои формы наследуются от моего базового класса, и в моем базовом классе у меня есть код ниже,
Public Class BaseForm Inherits System.Windows.Forms.Form Protected Overrides Sub OnVisibleChanged(e As System.EventArgs) MyBase.OnVisibleChanged(e) If Me.Visible Then ' create Handler to each Button when Form is shown (becomes visible) For Each myControl As Control In Me.Controls If myControl.GetType Is GetType(Button) Then AddHandler myControl.Click, AddressOf TestModul.ClickHandler End If Next Else ' remove Handler from each Button when Form is left (becomes unvisible) For Each myControl As Control In Me.Controls If myControl.GetType Is GetType(Button) Then RemoveHandler myControl.Click, AddressOf TestModul.ClickHandler End If Next End If End Sub End Class
Тестовый модуль выглядит следующим образом:
Module TestModul Public Sub ClickHandler(sender As Object, e As System.EventArgs) Dim mySender As Control = sender MessageBox.Show(mySender.Name + vbCrLf + mySender.Parent.Name) If (mySender.Parent.GetType().ToString().Contains("UserControl")) Then MessageBox.Show("Its a user control") End If End Sub End Module
До сих пор все работает правильно, но проблема заключается в реализации кода для моих usercontrols, которые все наследуются от моего baseusercontrol, который написан ниже:
Public Class BaseUserControl Inherits System.Windows.Forms.UserControl Protected Overrides Sub OnVisibleChanged(e As System.EventArgs) MyBase.OnVisibleChanged(e) If Me.Visible Then ' create Handler to each Button when Form is shown (becomes visible) For Each myControl As Control In Me.Controls If myControl.GetType Is GetType(Button) Then AddHandler myControl.Click, AddressOf TestModul.ClickHandler End If Next Else ' remove Handler from each Button when Form is left (becomes unvisible) For Each myControl As Control In Me.Controls If myControl.GetType Is GetType(Button) Then RemoveHandler myControl.Click, AddressOf TestModul.ClickHandler End If Next End If End Sub End Class
эта процедура должна выполняться следующим образом: каждый раз, когда нажимается кнопка, она должна показывать мне окно сообщений и отображать имя этой кнопки и форму, содержащую эту кнопку.
Что я уже пробовал:
как прослеживается он не входит в это состояние,
If myControl.GetType Is GetType(Button) Then
и видите это как ложное условие. Я удалил оператор If и снова увидел, что он не читает строку кода
AddHandler myControl.Click, AddressOf TestModul.ClickHandler
так что опять же изменение не будет сделано на кнопках.
Well in on of my forms it's working, because I opened it and manually removed the line of inheritence after the name of those classes, I just removed the line ' Inherits baseusercontrol' and rewrote it. then it worked.
Но я не должен делать это для всех других классов. Каков будет автоматизированный путь к этому?
Заранее благодарю вас за вашу помощь.
m.r.m.40
Коды выше даны мне профессиональным членом "Ральф Мейер".
Richard MacCutchan
Тогда вам следует обратиться за помощью к Ральфу Мейеру.
m.r.m.40
Я не знаю, как с ним связаться.
Я только что выяснил, в чем проблема. Я просто отправлю его сюда.
Richard MacCutchan
Вернитесь к сообщению, где он дал вам этот код.
0x01AA
Ваш UserControl, вероятно, не является контейнером для кнопки.
Проверить:
а) переместите свой элемент управления в конструктор, я предполагаю, что кнопка останется на том же месте.
б.) выводить для теста не из UserControl, а из Panel
BillWoodruff
Проверьте, находятся ли кнопки в UserControl на "поверхности" UserControl (содержащейся в коллекции ControlCollection UserControl). Если некоторые или все кнопки находятся внутри других ContainerControls, вы не получите к ним доступ через Me.Controls ... вместо того, чтобы использовать меня.Контроля.Найти с помощью рекурсивного параметра установлено в значение true.
Ralf Meier
Я бы не стал добавлять этот код в usercontrol. Я бы сделал это в той форме, как описано. Когда вы перебираете коллекцию Forms. control, вы также можете проверить, есть ли в каждом из этих элементов управления также дочерние элементы управления-в этом случае вы проверяете дочерние элементы управления и подключаете их (при необходимости) также к обработчику. См. мое решение (2) на этот счет ...
Philippe Mori
Зачем вам добавлять / удалять обработчик в соответствии с видимостью? Как бы вы нажали на невидимую кнопку?
m.r.m.40
Я думаю, что вы пропустили эту строку комментария,
'удалить обработчик из каждой кнопки, когда форма оставлена (становится невидимой)
Philippe Mori
И вы не ответили на вопрос... Похоже, вы скопировали чужой бедный код!
Поэтому я задам свой вопрос иначе. Скажите мне, что произойдет, если вы удалите весь код внутри OnVisibleChanged
.
Ralf Meier
Код-внушение исходит от меня ...
Я выбрал метод OnVisibleChanged-для добавления и удаления обработчиков, потому что этот метод находится непосредственно в команде Form.show и/или Form.hide. По-моему, я удаляю ненужные соединения. Конечно, можно также соединить обработчики с формой.OnHandleCreated и удалить его по форме.Онхандледестройед. Есть несколько вариантов-я выбрал именно этот.
Во всяком случае, с видимостью вы правы. Это будет исходить только из формы. Никакой элемент управления на форме или любой ContainerControl формы не становится невидимым, если форма скрывается.