2015-04-06 45 views
-1

我想根據從DataGridView中選擇的行打開同一表單的多個實例。 我目前的代碼有效,但在進入下一個之前等待每個表單關閉。 我需要同時打開表格,但仍然要通過事件向主窗體回報。VB .Net與事件相同的多個實例

Public Class frmARLog 
    Private WithEvents edit As frmEditARLog 
    'WithEvents: indicate that we want to receive events raised by this object 

    Sub New() 

     ' This call is required by the designer. 
     InitializeComponent() 

     ' Add any initialization after the InitializeComponent() call. 
     fill() 
    End Sub 

    Sub fill() 
     Dim AR As AltARLog = New AltARLog 

     dgvARLog.DataSource = AR.getTable 

    End Sub 

    Private Sub btnEdit_Click(sender As Object, e As EventArgs) Handles btnEdit.Click 
     Dim iRowIndex As Integer 
     For i As Integer = 0 To dgvARLog.SelectedCells.Count - 1 

      iRowIndex = dgvARLog.SelectedCells.Item(i).RowIndex 
      openEditForm(dgvARLog.Rows(iRowIndex).Cells(0).Value.ToString, iRowIndex) 
     Next 
    End Sub 

    Sub openEditForm(arid As Integer, row As Integer) 
     edit = New frmEditARLog(arid) 
     AddHandler edit.FormClosing, AddressOf ItIsClosing 
     AddHandler edit.FormClosed, AddressOf ItIsClosed 
     edit.ShowDialog(Me) 
    End Sub 

    Private Sub ItIsClosing(sender As Object, e As FormClosingEventArgs) 
     If edit.Successful Then 
      fill() 
     End If 
     RemoveHandler edit.FormClosing, AddressOf ItIsClosing 
    End Sub 

    Private Sub ItIsClosed(sender As Object, e As FormClosedEventArgs) 
     RemoveHandler edit.FormClosed, AddressOf ItIsClosed 
     edit = Nothing 
    End Sub 
End Class 

回答

0

使用edit.ShowDialog(Me)你告訴它來鎖定調用的形式,你會與一個對話框顯示。

您想將此行更改爲:edit.Show(Me)

另要注意,你會只允許一個參考,以一個孩子從這個代碼。您可能需要考慮是否需要存儲對所有表單的引用。

我建議不要存儲它們。註冊您的活動並顯示。事件仍會如預期般觸發,您將需要使用事件的sender參數,這將是調用子窗體。

將此插入爲每個事件處理程序的第一行。

Dim frmEditARLog edit as frmEditARLog = DirectCast(sender, frmEditARLog) 
+0

關於註冊事件的資源的任何建議。 – Talon06

+0

您可以像現在一樣註冊事件。 –

相關問題