вместо boxAct пытается непосредственно обновление frmPrinc текущего «коробки» будучи щелкнули, он должен вместо этого поднять пользовательское событие что frmPrinc при подписке. frmPrinc может использовать эту информацию, как она считает нужным. Ниже я добавил пользовательское событие и подниму его в class boxAct. Форма подписывается на это событие, используя AddHandler, когда создается каждый экземпляр boxAct. Все вместе это выглядит примерно так:
Public Class frmPrinc
Public actEditing As boxAct
Public Class boxAct
Inherits Label
Public act As Integer
Public Event BoxClicked(ByVal box As boxAct)
Public Sub New(ByVal a As Integer)
act = a
End Sub
Private Sub boxAct_Click(sender As Object, e As EventArgs) Handles Me.Click
Me.Text = "Clicked"
RaiseEvent BoxClicked(Me)
End Sub
End Class
Private Sub showPlanning()
pan_plan.Controls.Clear()
Dim plan As New Control ' Control that will be used as a row
For i As Integer = 0 To 10
Dim box As New boxAct(i)
AddHandler box.BoxClicked, AddressOf box_BoxClicked
plan.Controls.Add(box)
Next
Panel1.Controls.Add(plan)
End Sub
Private Sub box_BoxClicked(box As boxAct)
actEditing = box
Debug.Print("Box Clicked: " & actEditing.act)
End Sub
End Class
Из комментариев:
Благодаря человеку, это сработало! Я хотел бы знать, хотя, почему мне нужно сделать такую структуру, чтобы поднять простое событие, которое изменяет основную форму ... Просто не делать ту же ошибку - ALGor Frile
Этот дизайн решение каждого должно сделать: "Loosely Coupled" vs. "Tightly Coupled". Подход, который я дал выше, относится к категории Loosely Coupled. Основным преимуществом слабосвязанного решения является re-usability. В вашем конкретном случае у нас есть класс boxAct, который повторно используется несколько раз, хотя и все в той же форме. Но что, если это не так? Что делать, если вы хотите использовать boxAct на нескольких формах (или даже иметь несколько «групп» из них)? С вашим оригинальным подходом, вы имели следующую строку:
frmPrinc.actEditing = boxact
, что означает, что при желании использовать класс boxAct с различной формой вы должны сделать копию класса boxAct, дать ему новое имя, а затем изменить вручную, что одна строки для ссылки на новую форме:
Public Class boxAct2
Private Sub clickBox(sender As Object, e As EventArgs)
Dim boxact As boxAct = DirectCast(sender, boxAct)
frmSomeOtherForm.actEditing = boxact
boxact.Text = "Clicked"
End Sub
End Class
Это показывает недостатка из сильносвязанных подхода, который использует ссылки на типы специфики (форма в данном случае), чтобы общаться. Трудно связанный подход может быть изначально проще реализовать, когда вы кодируете быстро и яростно, но затем он страдает от повторного использования на линии. Существуют сценарии, в которых решение с жесткой связью имеет смысл, но только вы можете принять это решение; эти сценарии обычно связаны с каким-то «субконтролем», который только когда-либо будет использоваться в каком-либо пользовательском контейнере/контролере и никогда не будет использоваться в другом месте.
С другой стороны, с слабосвязанным подходом, если мы хотим, чтобы повторно использовать класс boxAct в иной форме, то не изменяет ему потребовалось бы вообще (хотя в этот момент вы, вероятно, не хотите объявленный в вашей первоначальной форме!). В новой форме вы просто добавляете обработчик для события BoxClicked(), а затем выполняете то, что вам нужно сделать. Каждая форма получит события для соответствующих экземпляров boxAct.
Заключительные мысли ... Ваш оригинальный подход мог бы реально работать, но, скорее всего, был провал на этой линии (то же самое, что и выше):
frmPrinc.actEditing = boxact
Здесь были ссылки на frmPrinc используя то, что известно как Default Instance этой формы. Это сработало бы, если frmPrinc был «Объектом запуска» для вашего приложения. Я предполагаю, что это не так, и вы создавали экземпляр frmPrinc откуда-то еще. Чтобы сделать оригинальный подход работать, вам пришлось бы передать ссылку на ваш ACTUAL экземпляр frmPrinc на класс boxAct (обычно через конструктор в тесно связанных решениях).
показать код – Blag
Да, спасибо, я забыл это сделать, но это не проблема У меня есть –
Это потому, что я считаю, что этот элемент управления является строкой, но я могу сделать это без –