【问题标题】:VB.NET Crystal Report Viewer Locks other FormsVB.NET Crystal Report Viewer 锁定其他窗体
【发布时间】:2012-02-26 11:55:49
【问题描述】:

如何在水晶报表视图运行时允许其他表单执行? 代码如下:

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 报告表:

【问题讨论】:

  • 你用什么代码来显示表格?

标签: vb.net crystal-reports-2008


【解决方案1】:

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

【讨论】:

  • 谢谢@Mark,但我不知道如何用我的代码来做这件事。我不太理解你的代码。对不起,我只是 VB 的新手。 ParentFormName 是一个新类吗?而且我无法将 frmPrint 转换为 New ParentFOrmName 因为 frmPrint 是 windowsForm...
  • 是否有任何方法或事件允许在关闭表单打印时处理 rptDoc 或 DataTable??
  • @Jed 您可以尝试在表单打印的关闭方法中添加和事件,然后在主表单中订阅它,使用它来关闭您的 rptDoc 和 DataTable
  • @Jed 回答您的问题。我不知道您用来创建 frmPrnt 的表单的名称,所以我使用了通用名称 ParentFormName。您的代码中有一条语句,您在其中声明 frmPrnt = New formnameDim frmPrnt as New formname 您曾经使用过什么作为 formname,这就是我所说的 ParentFormName。
【解决方案2】:

代替

  frmPrint.ShowDialog()

使用

  frmPrint.Show()

【讨论】:

  • 非常感谢。弥迦.. :-D
  • 哦,有问题。它给出了运行时错误。它说 - 纯虚函数调用 (R6025)。我认为.Show的使用有问题
  • 您在使用 vb.net 时遇到错误,表单类型是什么? Windows 窗体?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-09
  • 1970-01-01
  • 2012-08-26
  • 1970-01-01
  • 2012-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多