2016-12-19 4 views
0

Я использую VB .NET для создания планирования, и у меня возникла небольшая проблема с событиями. В основной форме я помещаю панель, в которую я добавляю программные строки и поля в этих строках. У меня внутри формы TextBox и панель, содержащая все поля. Я хочу изменить текст TextBox, когда я нажимаю на поле, поэтому я использую оператор AddHandler, но он не работает. Я попытался отладить его, и я понял, что он на самом деле вызывает sub и внутри него, я вижу изменения, которые он делает (TextBox.Text становится тем, что я хочу), но когда он выходит из подкаталога, он, как ничто не изменилось. Я не знаю, был ли я достаточно ясным. БлагодаряVB .NET обработчик событий элементов управления

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

Public Class frmPrinc 
    Public actEditing As Object 

    Private Class boxAct 
     Inherits Label 

     Public act As Integer 

     Public Sub New(ByVal a As Integer) 
      act = a 

      AddHandler Me.Click, AddressOf clickBox 
     End Sub 

     Private Sub clickBox(sender As Object, e As EventArgs) 
      Dim boxact As boxAct = DirectCast(sender, boxAct) 
      frmPrinc.actEditing = boxact 
      boxact.Text = "Clicked" 
     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 
      plan.Controls.Add(New boxAct(i)) 
     Next 
     Panel1.Controls.Add(plan) 
    End Sub 
End Class 

Когда я бегу, что текст изменений коробчатых но actEditing до сих пор ничего. ..

+1

показать код – Blag

+0

Да, спасибо, я забыл это сделать, но это не проблема У меня есть –

+0

Это потому, что я считаю, что этот элемент управления является строкой, но я могу сделать это без –

ответ

1

вместо 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 (обычно через конструктор в тесно связанных решениях).

+0

Спасибо, человек, это сработало! Хотелось бы узнать, почему мне нужно создать такую ​​структуру, чтобы поднять простое событие, которое изменяет основную форму ... Просто чтобы не повторить ту же ошибку –

+0

См. Отредактированный пост выше для ответа на ваш последний комментарий. –

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