IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

ReportViewer - C#


Sujet :

C#

  1. #1
    Membre à l'essai
    Profil pro
    Ingenieur BE
    Inscrit en
    Novembre 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingenieur BE

    Informations forums :
    Inscription : Novembre 2008
    Messages : 21
    Points : 21
    Points
    21
    Par défaut ReportViewer - C#
    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

    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();
                        }
                    }
                }
     
            }
    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 .....

    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();
            }

  2. #2
    Membre à l'essai
    Profil pro
    Ingenieur BE
    Inscrit en
    Novembre 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingenieur BE

    Informations forums :
    Inscription : Novembre 2008
    Messages : 21
    Points : 21
    Points
    21
    Par défaut
    Petit ajout pour compléter mes tests.

    Je me suis orienté vers éventuellement la mémoire ... et j'(ai tenté de forcer le Garbage). Ca semble venir de ce point :
    Quand l'affichage s'affiche bien, je GC se passe bien, sinon ca plante.

    Si je fais ça, j'arrive à détecter l'erreur avant qu’elle freeze l'application. (j'ai fait les tests en amont sans fermer l'application et vu que lorsque j'avais une erreur de GC (isERREUR = true) , le localReport.IsReadyForRendering (ou RefreshReport() ) plantait lui aussi a ce moment la.

    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
     
            private void fncTH()
            {
                System.GC.Collect();
                GC.WaitForPendingFinalizers();
            }
     
            private void FrmPrint_Load(object sender, EventArgs e)
            {
                long timeout = Environment.TickCount;
                Thread mXX = new Thread(fncTH);
                mXX.Start();
                while (mXX.IsAlive && timeout + 5000 > Environment.TickCount) ;
                if(mXX.IsAlive)
                {
                    mXX.Abort();
                    isERREUR = true;
                    _retour = false;
                    this.Close();
                }
            }
    J'ai tenté de re-forcer derrière, mais rien n'y fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
                FrmPrint FrmXX = new FrmPrint();
                bool status = FrmXX.ShowD(mReport, mCurve);
                if (!status)
                {
                    MessageBox.Show("Erreur de GC. Nouvelle tentative");
                    status = FrmXX.ShowD(mReport, mCurve);
                }
                return status;
    A noter que pour minimiser les erreurs possible j'affiche un "Report.rdlc" dépourvu de data, simplement une zone de texte statique
    Si ca peut vous donner des pistes pour me répondre ...

    A vot'bon coeur s'iouplait ....

  3. #3
    Membre à l'essai
    Profil pro
    Ingenieur BE
    Inscrit en
    Novembre 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingenieur BE

    Informations forums :
    Inscription : Novembre 2008
    Messages : 21
    Points : 21
    Points
    21
    Par défaut
    Manifestement personne n'a pu m'aider ....

    il semble que la librairie ReportViewer soit livré avec un cadeau intégré. "Une fuite de mémoire offerte !! "

    une solution éventuelle :

    https://www.codeproject.com/Question...ft-Report-rdlc

    pour moi aucune d'entre elle n'a résolu mon problème. J'ai détourné la fuite sur un petit programme autonome que j'appelle quand j'en ai besoin.
    Si le "dit" programme plante, au moins l'application principale n'est pas affectée. Ça ne résous pas le problème, mais il n'est pas rendu critique.

    Voila ...

    Bon Dev a tous ....

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. ReportViewer bogue avec "print layout" ?
    Par evans dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 21/06/2007, 03h47
  2. [C#] récuper l'image générer par un ReportViewer dans le code
    Par aurelien.tournier dans le forum Windows Forms
    Réponses: 1
    Dernier message: 02/03/2007, 14h36
  3. Intégration image externe en paramètres dans reportviewer
    Par penchu dans le forum Windows Forms
    Réponses: 1
    Dernier message: 08/02/2007, 19h35
  4. [HELP]probleme avec reportviewer.jar
    Par myaouss dans le forum SAP Crystal Reports
    Réponses: 16
    Dernier message: 08/02/2007, 17h54
  5. [C#] Comment affecter un rapport a un ReportViewer
    Par Cazaux-Moutou-Philippe dans le forum Windows Forms
    Réponses: 2
    Dernier message: 23/05/2006, 16h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo