Bonjour A tous,
Je travaille actuellement sur une impression de données avec ReportViewer de cro$oft. Ça coince un peu .... j'ai en fait un fonctionnement aléatoire, des fois ca fonctionne, des fois ça freeze complètement l'application.
A noter que quand ça freeze je ne peux rien faire, même en mode DBG. Quelqu'un a déjà eu des problèmes de ce genre avec cette bibliothèque ? Au debut j'ai pensé que c'etait mon "rdlc" qui etait pas bon, mais pk ca
foctionnerait de facon aléatoire ... pour mes tests, j'ai toujours les mêmes données, pas de mutlithread, juste envoyé par un bouton (affichage d'une "form" sépcifique).
Voici ma fonction
si quelqu'un a une idée ... merci d'avance ... sinon je vais finir par me rabattre sur impression manuelle (Graphics) mais bon pas évolutif et parfois problématique en fonction des imprimantes .....
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 private void FrmPrint_Shown(object sender, EventArgs e) { long timeoverflow = 0; //--------------------------------------------------------// ReportDataSource data1 = new ReportDataSource(); ReportDataSource data2 = new ReportDataSource(); data1.Name = "DataSet1"; data2.Name = "DataSet2"; data1.Value = this.DataReportBindingSource1; data2.Value = this.DataReportBindingSource2; //--------------------------------------------------------// List<DataReport> m_infos = new List<DataReport>(); m_infos.Add(_mReport); this.DataReportBindingSource1.DataSource = m_infos; this.DataReportBindingSource2.DataSource = _Datapoints; //--------------------------------------------------------// this.reportViewer1.LocalReport.DataSources.Clear(); this.reportViewer1.Clear(); this.reportViewer1.Reset(); LocalReport localReport = reportViewer1.LocalReport; //--------------------------------------------------------// this.reportViewer1.ProcessingMode = ProcessingMode.Local; localReport.ReportPath = "Report3.rdlc"; localReport.DataSources.Add(data1); localReport.DataSources.Add(data2); localReport.Refresh(); //--------------------------------------------------------// if (this.reportViewer1.CancelRendering(2000)) { if (localReport != null) { if (localReport.IsReadyForRendering) // QUAND JE PLANTE, en faisant un Break, c'est ici que ca amene. La valeur d'ailleur n'est pas évaluable : Impossible d'évaluer l'expression, sinon true ou false quand ca fonctionne. { this.reportViewer1.Refresh(); this.reportViewer1.RefreshReport(); } } } }
Merci d'avance pour la lecture, desolé pour les fautes, et merci++ a ceux qui me trouverons une explication voir même ... une solution
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
pour info j'ai essayé sans plus de resultat de mettre le RefreshReport() dans un thread isolé (histoire de le tuer si plantage) mais ca ne fonctionne pas , impossible de tuer le thread quand ca plante ..
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81 private delegate void RunPrintDelegate(); void RunPrint() { string strX = ""; if (this.InvokeRequired) { RunPrintDelegate mfunc = new RunPrintDelegate(RunPrint); this.Invoke(mfunc, new object[] { }); } else { try { this.reportViewer1.RefreshReport(); } catch { strX = "abs"; } } } private void FrmPrint_Shown(object sender, EventArgs e) { long timeoverflow = 0; //--------------------------------------------------------// ReportDataSource data1 = new ReportDataSource(); ReportDataSource data2 = new ReportDataSource(); data1.Name = "DataSet1"; data2.Name = "DataSet2"; data1.Value = this.DataReportBindingSource1; data2.Value = this.DataReportBindingSource2; //--------------------------------------------------------// List<DataReport> m_infos = new List<DataReport>(); m_infos.Add(_mReport); this.DataReportBindingSource1.DataSource = m_infos; this.DataReportBindingSource2.DataSource = _Datapoints; //--------------------------------------------------------// this.reportViewer1.LocalReport.DataSources.Clear(); this.reportViewer1.Clear(); this.reportViewer1.Reset(); LocalReport localReport = reportViewer1.LocalReport; //--------------------------------------------------------// this.reportViewer1.ProcessingMode = ProcessingMode.Local; localReport.ReportPath = "Report3.rdlc"; localReport.DataSources.Add(data1); localReport.DataSources.Add(data2); localReport.Refresh(); //--------------------------------------------------------// /* if (this.reportViewer1.CancelRendering(2000)) { if (localReport != null) { if (localReport.IsReadyForRendering) { this.reportViewer1.Refresh(); this.reportViewer1.RefreshReport(); } } } */ mTh = new Thread(RunPrint); mTh.Priority = ThreadPriority.AboveNormal; timeoverflow = Environment.TickCount; mTh.Start(); while (mTh.IsAlive && (timeoverflow + 2000 > Environment.TickCount)) ; this.Text = "Print"; if (mTh.IsAlive) { mTh.Abort(); this.Text = "refresh by Reset Thread"; } this.reportViewer1.Refresh(); this.Invalidate(); //this.reportViewer1.RefreshReport(); }
Partager