VB.NET Crystal Report Viewer блокирует другие формы

Что я сделаю, чтобы разрешить выполнение других форм во время работы представления Crystal Report? Вот код:

Public Sub printCurrentHistory()
    If dt.Columns.Count = 0 Then
        With dt
            .Columns.Add("update_time")
            .Columns.Add("sender")
            .Columns.Add("humidity")
            .Columns.Add("temperature")
            .Columns.Add("rain")
            .Columns.Add("wind_dir")
            .Columns.Add("wind_speed")
        End With
    End If
    For Each dr As DataGridViewRow In frmMain.dgvSearch.Rows

        dt.Rows.Add(dr.Cells("Updated").Value, dr.Cells("Sender").Value, dr.Cells("Humidity").Value, dr.Cells("Temperature").Value, dr.Cells("Rain").Value, dr.Cells("Wind_Direction").Value, dr.Cells("Wind_Speed").Value)
    Next

    Dim rptDoc As CrystalDecisions.CrystalReports.Engine.ReportDocument
    rptDoc = New CrystalReport1
    rptDoc.SetDataSource(dt)

    frmPrint.CrystalReportViewer1.ReportSource = rptDoc
    frmPrint.ShowDialog()
    dt.Rows.Clear()
    dt.Clear()
    dt.Dispose()
    rptDoc.Dispose()
End Sub

Форма отчета Crystal Viewer: введите описание изображения здесь


person Jed    schedule 26.02.2012    source источник
comment
какой код вы используете для отображения формы?   -  person Micah Armantrout    schedule 26.02.2012


Ответы (2)


Разница между Show и _ 2_ в том, что 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
person Mark Hall    schedule 26.02.2012
comment
Спасибо @Mark, но я не знаю, как это сделать с моим кодом ... Я плохо понял ваш код. извините, я новичок в VB. ParentFormName - это новый класс? И я не могу преобразовать frmPrint в New ParentFOrmName, потому что frmPrint - это windowsForm ... - person Jed; 26.02.2012
comment
Есть ли какой-либо метод или событие, позволяющее избавиться от rptDoc или DataTable в печати формы при ее закрытии? - person Jed; 26.02.2012
comment
@Jed Вы можете попробовать добавить событие и событие в метод закрытия вашей формы, а затем подписаться на него в своей основной форме, используя его для закрытия ваших rptDoc и DataTable. - person Mark Hall; 26.02.2012
comment
@Jed Чтобы ответить на ваши вопросы. Я не знаю имя формы, которую вы использовали для создания frmPrnt, поэтому я использовал общее имя ParentFormName. У вас есть инструкция в вашем коде, где вы указываете frmPrnt = New formname или Dim frmPrnt as New formname, что вы когда-либо использовали для имени формы, это то, что я имел в виду под ParentFormName. - person Mark Hall; 26.02.2012

Вместо того

  frmPrint.ShowDialog()

использовать

  frmPrint.Show()
person Micah Armantrout    schedule 26.02.2012
comment
Большое тебе спасибо. Мика .. :-D - person Jed; 26.02.2012
comment
О, есть проблема. Выдает ошибку RUntime. Там написано - вызов чистой виртуальной функции (R6025). Я думаю, что есть проблема в использовании .Show - person Jed; 26.02.2012
comment
Вы используете vb.net и получили эту ошибку, какой тип формы? Форма Windows? - person Micah Armantrout; 26.02.2012