VB.NET Crystal Report Viewer блокирует другие формы - PullRequest
1 голос
/ 26 февраля 2012

Что я буду делать, чтобы другие формы могли работать во время работы 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: enter image description here

Ответы [ 2 ]

2 голосов
/ 26 февраля 2012

Разница между 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
1 голос
/ 26 февраля 2012

Вместо

  frmPrint.ShowDialog()

используйте

  frmPrint.Show()
...