Мульти родительская форма - PullRequest
1 голос
/ 16 февраля 2012

У меня есть vb .net winform, которую показывают другие формы.У меня есть frmA.vb, frmB.vb, frmC.vb и frmD.vb.

Это все формы могут вызывать frmItem.vb.frmItem.vb позволяет пользователю выбрать элемент из базы данных, этот элемент отправляется путем вызова свойства Set для родителя.

т.е.

Я открываю frmA, нажимаю кнопку (что-то вроде:)

  fi = new frmItem(frmA) 'frmItem has 4 New() methods, frmA.. b... c and d
  'i need to pass the correct parent.
  fi.showModal()

Итак, когда я добавляю элемент, он вызывает

  fA.addItem(item_id)

Все работает хорошо, я сомневаюсь в оптимизации, потому что я продублировал frmItem;одна копия управляет frmA и frmB, а другая, frmC и frmD.

т.е.

в frmItem1, когда я отправляю элемент, я использую:

private fB as frmB
private fA as frmA



if parentFrmA is nothing then
   'Is frmB
   fB.addItem(item_id)
else
   'Is frmA
   fA.addItem(item_id)
end if

И на frmItem2:

private fC as frmC
private fD as frmD



if parentFrmC is nothing then
   'Is frmD
   fD.addItem(item_id)
else
   'Is frmC
   fC.addItem(item_id)
end if

Если я изменяю frmItem1, мне нужно изменить frmItem2 и наоборот, потому что они должны выглядеть и вести себя как одна.

Все четыре формы имеютто же самое Set Property, но так как они разные формы, я не могу использовать уникальный класс Form в frmItem.

Возможно ли, что одна форма может легко управлять несколькими родителями ??

Если вам нужна дополнительная информация, дайте мне знать.Спасибо

1 Ответ

0 голосов
/ 16 февраля 2012

Я не могу полностью следовать вашему примеру, потому что, ну, я думаю, что просто трудно следовать.

Но в целом, похоже, что эти дочерние формы должны просто вызывать событие, которое родительская форма ожидает. Таким образом, вы можете немного отделить свои проблемы и не жестко кодировать эти зависимости.

Вы можете попробовать создать собственный класс EventArgs, следуя рекомендациям:

Public Class ChildFormEventArgs
  Inherits EventArgs

  Private _ItemID As Integer

  Public Sub New(ByVal itemID As Integer)
    _ItemID = itemID
  End Sub

  ReadOnly Property ItemID() As Integer
    Get
      Return _ItemID
    End Get
  End Property
End Class

У ваших дочерних форм будет публичное мероприятие, и вы будете поднимать его, когда случится такая «добавленная» вещь:

Public Class Form2
  Public Event ItemAdded(ByVal sender As Object, ByVal e As ChildFormEventArgs)

  Private _ItemID as Integer

  Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
    RaiseEvent ItemAdded(Me, New ChildFormEventArgs(_ItemID))
  End Sub
End Sub

И тогда ваша родительская форма слушает и может действовать соответственно:

Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
  Using testForm As New Form2()
    AddHandler testForm.ItemAdded, AddressOf ChildForm_ItemAdded
    testForm.ShowDialog(Me)
    RemoveHandler testForm.ItemAdded, AddressOf ChildForm_ItemAdded
  End Using
End Sub

Private Sub ChildForm_ItemAdded(ByVal sender As Object, ByVal e As ChildFormEventArgs)
  '// do something here.
  '// sender is the child form that called it
  '// e is the event arguments that contains the ItemID value
End Sub
...