Разница между Show
и ShowDialog
в том, что ShowDialog
- это модальное приложение, означающее, что оно предотвращает что-либо еще, пока вы его не закроете. Show
с другой стороны подбрасывает Form
и продолжает свой путь. Глядя на ваш код, я догадываюсь, что ваша проблема в том, что вы избавляетесь от rptDoc
и своего источника данных из-под вашего frmPrint
. Вам нужно будет изменить свой frmPrint, чтобы сделать его более автономным. Я бы сделал что-то вроде.
frmPrint = New ParentFormName(dt) 'The Form frmPrint is instantiated from
frmPrint.Show()
А потом
Public Sub New( dt as DataTable)
' This call is required by the designer.
InitializeComponent()
' Add any initialization after the InitializeComponent() call.
Dim rptDoc As CrystalDecisions.CrystalReports.Engine.ReportDocument
rptDoc = New CrystalReport1
rptDoc.SetDataSource(dt)
CrystalReportViewer1.ReportSource = rptDoc
End
И тогда в вашем событии FormClosing избавьтесь от своих Объектов.
Это непроверенный код, я просто пытаюсь дать вам несколько идей.
Другой вариант, как я указал в своем комментарии, - добавить событие в вашу печатную форму и подписаться на него в основной форме следующим образом.
Public Class Form1
Dim frm2 As Form2
Private Sub CloseMyData()
'Dispose of your Data here
RemoveHandler frm2.myClosingEvent, AddressOf CloseMyData
End Sub
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
frm2 = New Form2
AddHandler frm2.myClosingEvent, AddressOf CloseMyData
frm2.Show()
End Sub
End Class
Public Class Form2
Public Event myClosingEvent()
Private Sub Form2_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
RaiseEvent myClosingEvent()
End Sub
End Class