मैं कोशिश कर रहा हूँ करने के लिए "वृद्धि" मेरी रिपोर्टिंग कोड जोड़ने के द्वारा एक लोडिंग स्क्रीन, जबकि क्रिस्टल रिपोर्ट तैयार की जा रही है/भरी हुई है. इससे पहले कि मैं कोशिश कर रहा शुरू करने के लिए जोड़ें लोड हो रहा है स्क्रीन, सभी की रिपोर्ट आ जाएगा बस ठीक है, लेकिन कर्सर परिवर्तन बस नहीं था "पर्याप्त" के लिए एक संकेत है कि गया था, आवेदन अभी भी काम पर खींच रिपोर्ट - उनमें से कुछ एक समय लग सकता है - तो मैं चाहता था प्रदान करने के लिए एक अधिक "स्पष्ट" दृश्य संकेत है.
आदेश में यह पूरा करने के लिए, मैं डाल दिया है रिपोर्ट के निर्माण विधि कॉल में एक BackgroundWorker
में मौजूद है कि लोड हो रहा है स्क्रीन ही (मैं नहीं मिल गया है चारों ओर करने के लिए सीखने का उपयोग कैसे करें Async/Await
काफी अच्छी तरह से अभी तक आरामदायक महसूस करने के लिए कि का उपयोग कर के बजाय). लोड हो रहा है स्क्रीन के ऊपर आता है और सही ढंग से सब कुछ प्रकट होता है काम करने के लिए उम्मीद के रूप में जब तक यह वास्तव में प्रयास रिपोर्ट प्रदर्शित करने के लिए स्क्रीन पर. उस बिंदु पर,"कृपया प्रतीक्षा करें जब तक दस्तावेज़ प्रसंस्करण है." बॉक्स के ऊपर आता है (में CrystalReportViewer
नियंत्रण के रूप में इस्तेमाल किया, प्रदर्शित करने के लिए रिपोर्ट), लेकिन यह सिर्फ वहाँ बैठता है, नहीं भी कताई. अंत में, अपने आईडीई एक त्रुटि फेंकता प्राप्त करने के बारे में एक ContextSwitchDeadlock
और मैं बहुत ज्यादा सिर्फ है रद्द करने के लिए निष्पादन.
यहाँ मेरी dlgReportLoading
"छप स्क्रीन" के साथ एक PictureBox
नियंत्रण शामिल है कि एक एनिमेटेड GIF:
Imports System.Windows.Forms
Public Class dlgReportLoading
Private DisplayReport As Common.CRReport
Private WithEvents LoadReportWorker As System.ComponentModel.BackgroundWorker
Public Sub New(ByRef Report As Common.CRReport)
InitializeComponent()
DisplayReport = Report
End Sub
Private Sub dlgReportLoading_Load(sender As Object, e As EventArgs) Handles Me.Load
Me.Cursor = Cursors.WaitCursor
Me.TopMost = True
Me.TopMost = False
LoadReportWorker = New System.ComponentModel.BackgroundWorker
LoadReportWorker.RunWorkerAsync()
End Sub
Private Sub dlgReportLoading_FormClosed(sender As Object, e As FormClosedEventArgs) Handles Me.FormClosed
Me.Cursor = Cursors.Default
End Sub
Private Sub LoadReport_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles LoadReportWorker.DoWork
If Not DisplayReport.ReportOption = Common.CRReport.GenerateReportOption.None Then
Select Case DisplayReport.ReportOption
Case Common.CRReport.GenerateReportOption.DisplayOnScreen
'-- This is the method I'm currently testing
DisplayReport.ShowReport()
Case Common.CRReport.GenerateReportOption.SendToPrinter
DisplayReport.PrintReport()
Case Common.CRReport.GenerateReportOption.ExportToFile
DisplayReport.ExportReport()
End Select
End If
DisplayReport.ReportOption = Common.CRReport.GenerateReportOption.None
'--
'-- This code was in use before trying to generate the reports in the background
'If Not DisplayReport.CrystalReport Is Nothing Then
' DisplayReport.CrystalReport.Dispose()
'End If
'--
End Sub
Private Sub LoadReport_Complete(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles LoadReportWorker.RunWorkerCompleted
Me.DialogResult = DialogResult.OK
Me.Close()
End Sub
End Class
के रूप में उल्लेख किया ऊपर कोड, मैं वर्तमान में परीक्षण ShowReport()
विधि के रूप में यहाँ परिभाषित किया गया:
Protected Friend Sub ShowReport()
Dim ReportViewer As frmReportPreview
Me.PrepareReport()
ReportViewer = New frmReportPreview(Me)
With ReportViewer
.WindowState = FormWindowState.Maximized
.Show()
End With
End Sub
और frmReportPreview
इस प्रकार है:
Imports System.ComponentModel
Public Class frmReportPreview
Private DisplayReport As Common.CRReport
Private ReportToDisplay As CrystalDecisions.CrystalReports.Engine.ReportDocument
Public Sub New(ByRef Report As Common.CRReport)
InitializeComponent()
DisplayReport = Report
PrepareReportForDisplay()
Me.rptViewer.ReportSource = Nothing
Me.rptViewer.ReportSource = ReportToDisplay
' SET ZOOM LEVEL FOR DISPLAY:
' 1 = Page Width
' 2 = Whole Page
' 25-100 = zoom %
Me.rptViewer.Zoom(1)
Me.rptViewer.Show()
End Sub
Private Sub frmReportPreview_Shown(sender As Object, e As EventArgs) Handles Me.Shown
'-- HANGS HERE
Me.rptViewer.RefreshReport()
End Sub
Private Sub frmReportPreview_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing
ReportToDisplay.Dispose()
Me.rptViewer.ReportSource = Nothing
End Sub
'...CODE FOR PREPARING THE REPORT TO BE DISPLAYED
End Class
के dlgReportLoading
फार्म चबूतरे सही ढंग से और एनीमेशन निभाता है जब तक frmReportPreview
चबूतरे के सामने यह (यह बंद नहीं करता). छोटे से बॉक्स है कि क्या सामान्य रूप से एक एनिमेटेड कताई चक्र का संकेत रिपोर्ट डेटा लोड किया जा रहा है प्रकट होता है, लेकिन लगभग तुरंत जमा देता है जगह में.
मैं एक ब्रेकप्वाइंट में LoadReport_DoWork()
विधि के dlgReportLoading
फार्म के बाद कॉल करने के लिए ShowReport()
विधि, लेकिन यह कभी नहीं हो जाता है कि बात करने के लिए. मैं भी एक में LoadReport_Complete()
विधि के रूप में है कि है कि यह कभी नहीं हिट तो और है कि संवाद वास्तव में कभी नहीं बंद कर देता है.
मैं डाल दिया है एक और ब्रेकप्वाइंट के अंत में frmReportPreview_Shown
विधि, अधिकार के बाद Me.rptViewer.RefreshReport()
कॉल, लेकिन यह कभी नहीं है कि हिट, तो यह स्पष्ट लगता है, जहां यह है कि बातें कर रहे हैं अटक रही है, लेकिन केवल जब इस रिपोर्ट उत्पन्न किया जा रहा है के माध्यम से BackgroundWorker
. अगर मैं सिर्फ कॉल ShowReport()
विधि के बिना इसे भेजने के माध्यम से "छप स्क्रीन" और BackgroundWorker
, सब कुछ उत्पन्न करता है और प्रदर्शित करता है सामान्य रूप से ।
मैंने कोशिश की है डाल RefreshReport()
विधि में अपने स्वयं के BackgroundWorker
कोई परिवर्तन नहीं के साथ व्यवहार में. मैंने कोशिश की है बनाने के frmReportPreview
वस्तु प्रदर्शन modally के साथ ShowDialog()
के बजाय सिर्फ Show()
. इस में से कोई भी लगता है मदद करने के लिए इस मुद्दे को.
मैं एक लग रहा है कुछ किया जा रहा है का निपटारा भी जल्दी में कहीं है, लेकिन मैं बाहर आंकड़ा नहीं कर सकते कि क्या होगा. मैं प्रदान कर सकते हैं बाकी रिपोर्ट की तैयारी कोड से frmReportPreview
यदि आवश्यक हो, लेकिन यह सब लगता है काम करने के लिए त्रुटि के बिना, के रूप में दूर के रूप में मैं कर सकते हैं बता. मैं कर रहा हूँ गुरेज नहीं की कोशिश कर के लिए वैकल्पिक तरीकों को पूरा करने के अपने लक्ष्य को दिखाने के लिए उपयोगकर्ता के लिए एक लोडिंग स्क्रीन, जबकि सभी रिपोर्ट की तैयारी जगह ले जा रहा है - उदाहरण के लिए, Async/Await
या अन्य बहु सूत्रण तरीकों में से एक - तो किसी भी सुझाव का स्वागत करते हैं । कृपया मुझे पता है अगर किसी भी अतिरिक्त स्पष्टीकरण की जरूरत है.
पर्यावरण
माइक्रोसॉफ्ट विंडोज 10 प्रो 21H1 (ओएस का निर्माण 19043.1348)
माइक्रोसॉफ्ट विजुअल स्टूडियो समुदाय 2017 (v15.9.38)
Crystal रिपोर्ट के लिए .NET Framework v13.0.3500.0 (रनटाइम संस्करण 2.0.50727)
संपादित करें: मैं उल्लेख करना भूल गया है कि इस सारी गंदगी बुलाया जा रहा है से एक GenerateReport()
विधि में CRReport
वर्ग के रूप में परिभाषित किया गया:
Public Sub GenerateReport(ByVal ReportGeneration As GenerateReportOption)
Me.ReportOption = ReportGeneration
If Me.ReportOption = GenerateReportOption.None Then
'...CODE FOR REQUESTING A GENERATION OPTION FROM THE USER
End If
Dim ReportLoadingScreen As New dlgReportLoading(Me)
ReportLoadingScreen.ShowDialog()
End Sub
जो, बारी में बुलाया जा रहा है से मुख्य रूप से इस तरह:
Private Sub PrintMyXMLReport(ByVal XMLFile As IO.FileInfo)
Dim MyXMLReport As New IO.FileInfo("\\SERVER\Applications\Reports\MyXMLReport.rpt")
Dim Report As New Common.CRReport(MyXMLReport, XMLFile)
Report.GenerateReport(Common.CRReport.GenerateReportOption.DisplayOnScreen)
End Sub