VB.NET Crystal Report Viewer锁定其他表单

时间:2012-02-26 00:13:22

标签: vb.net crystal-reports-2008

如何在Crystal视图运行时允许其他表单执行? 下面是代码:

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 个答案:

答案 0 :(得分:2)

ShowShowDialog之间的区别在于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 :(得分:1)

而不是

  frmPrint.ShowDialog()

使用

  frmPrint.Show()