Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di Rickycast
    Registrato dal
    Apr 2007
    residenza
    CHIERI (TO)
    Messaggi
    263

    [VB.NET] Errore creando Form con assembly Microsoft.ReportViewer.WinForms version 15.0.0.0

    Dopo molte ricerche, studio e fatica, sono riuscito a creare i Report con Visual Studio 2017 (VB .Net) e poi a stamparli in PDF. Peccato che la stampa in PDF funzioni solo in Progettazioe: quando cerco di ottenerla dall'eseguibile, ottengo il seguente Messaggio di errore:

    "Errore nella Sub ___ della Form____: 5 - Errore durante la creazione del Form. Per informazioni dettagliate vedere Exception.InnerException. Errore: Non è stato possibile caricare il file o l’assembly ‘Microsoft.ReportViewer.WinForms’ Version 15.0.0.0, Culture=neutral, PublicKeyToken=898545dc8080cc91 o una delle relative dipendenze. Impossibile trovare il file specificato.”

    Pensando che il problema fosse il codice relativo alla creazione del File .pdf, ho provato semplicemente ad aprire la Form contenente il ReportViewer (senza chiedere la stampa in PDF):
    codice:
        Private Sub FormV1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Try
    
                ' questa riga di codice carica i dati nella tabella 'SisAgentiDataSet.OrigineReportOrdine'. 
                ' È possibile spostarla o rimuoverla se necessario.
                Me.OrigineReportVarCliTableAdapter.Fill(Me.SisAgentiDataSet.OrigineReportVarCli)
    
                Me.ReportViewer1.RefreshReport()
    
            Catch ex As Exception
                MessageBox.Show("Errore nella Sub ''FormVarCli_Load'' della Form ''FormVarCli'': " & Err.Number & " - " & Err.Description)
            End Try
        End Sub

    come prima, funziona in Progettazione ma NON funziona dal File.exe. Mi da sempre lo stesso messaggio di errore.

    Quindi ipotizzo che il problema stia nel fatto che il File.exe non è in grado di aprire una Form che contiene un ReportViewer.
    In un thread molto simile a questo mio, trovato sfogliando il Web, sembrava che la soluzione fosse di posizionare l'Assembly nella stessa Directory dell'eseguibile e di cambiare il riferimento nel Progetto e poi di installare il Runtime di ReportViewer. Si trattava però di Visual Studio 2012.
    Ho comunque fatto quanto suggerito per il posizionamento ed il riferimento dell'Assembly, ma non ho potuto installare il Runtime di ReportViewer 2017 che ancora non esiste (o almeno io non l'ho trovato). Credo che si possa trovare una soluzione al Runtime nei pacchetti NuGet, ma non so quale sia il più adatto alle mie necessità.
    Comunque spero che qualcuno possa darmi una mano anche più in generale.
    Molte grazie in anticipo

  2. #2
    Moderatore di Windows e software L'avatar di URANIO
    Registrato dal
    Dec 1999
    residenza
    Casalpusterlengo (LO)
    Messaggi
    1,254
    L'errore è semplice, non trova la DLL Microsoft.ReportViewer.WinForms
    Tutto dipende da come hai aggiunti i riferimenti per utilizzarla.

    Se hai aggiunto il riferimento ad una dll fisica ti basta prendere la dll e metterla nel pacchetto.
    Se fai riferimento alla dll in GAC devi registrarla sulla macchina in cui vuoi usare l'applicativo.

  3. #3
    Utente di HTML.it L'avatar di Rickycast
    Registrato dal
    Apr 2007
    residenza
    CHIERI (TO)
    Messaggi
    263
    Porta pazienza per la mia replica, per utilizzare la dll ho fatto così:
    1 - ho copiato la Directory "packages" nella Directory in cui verrà utilizzato il file .exe
    2 - ho selezionato una Form qualsiasi
    3 - tasto destro sulla Casella degli Strumenti
    4 - Click su Scegli Elementi
    5 - Click su Sfoglia e quindi Click su "packages" - "Microsoft.ReportingServices.ReportViewerControl.W informs" - "lib" - "net40" - "Microsoft.ReportViewer.WinForms.dll"
    6 - Quindi Click su OK!
    A questo punto in Scegli Elementi compare flaggato l'Assembly Microsoft.ReportViewer.WinForms versione 15.0.0.0. con il path della Directory di lavoro.

    Questo procedimento però non funziona
    Cosa avrei dovuto fare invece?

  4. #4
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,521
    Quote Originariamente inviata da Rickycast Visualizza il messaggio
    Porta pazienza per la mia replica, per utilizzare la dll ho fatto così:
    1 - ho copiato la Directory "packages" nella Directory in cui verrà utilizzato il file .exe
    2 - ho selezionato una Form qualsiasi
    3 - tasto destro sulla Casella degli Strumenti
    4 - Click su Scegli Elementi
    5 - Click su Sfoglia e quindi Click su "packages" - "Microsoft.ReportingServices.ReportViewerControl.W informs" - "lib" - "net40" - "Microsoft.ReportViewer.WinForms.dll"
    6 - Quindi Click su OK!
    A questo punto in Scegli Elementi compare flaggato l'Assembly Microsoft.ReportViewer.WinForms versione 15.0.0.0. con il path della Directory di lavoro.

    Questo procedimento però non funziona
    Cosa avrei dovuto fare invece?

    ciao Riccardo 🙂
    ma il tuo progetto è winform o wpf?
    Se non ricordo male, usando winform devi indicare il path della cartella dalla quale hai preso la dll, in quanto si tratta di un pacchetto contenente dipendenze, quindi devi scaricare o comunque mettere nel progetto anche le sue dipendenze. Solitamente se trovi più dll è molto probabile che le deva importare tutte. Probabilmente la dll che hai messo ne richiede delle altre. Se vedi che dopo che hai scaricato il runtime nella cartella( del runtime )oltre alla dll trovi altre dll è molto probabile debba importare o semplicemente copiare nella cartella dell’exe tutti i file che trovi.

  5. #5
    Utente di HTML.it L'avatar di Rickycast
    Registrato dal
    Apr 2007
    residenza
    CHIERI (TO)
    Messaggi
    263
    Buongiorno U235 e grazie per la risposta.
    Io uso Winform e quindi credo (credo,..) di avere fatto come dici tu. L'Assembly in questione è compreso nella Directory "packages" che, a quanto mi è dato di capire, viene generata da Visual Studio quando si crea un nuovo Progetto. Quindi ho fatto così:
    Directory di lavoro:
    C:\MiaDirectory\MioProgramma.exe
    C:\MiaDirectory\package\
    È questo che intendi?
    In ogni caso anche così non funziona, magari ci vuole proprio un Runtime di ReportViewer,...
    Grazie comunque.

  6. #6
    Moderatore di Windows e software L'avatar di URANIO
    Registrato dal
    Dec 1999
    residenza
    Casalpusterlengo (LO)
    Messaggi
    1,254
    No, tu devi mettere tutte le dll referenziate dentro a
    c:\miadirectory

    Se vai nella directory del tuo progetto dovresti avere una directory che si chiama bin con all'interno un altra directory debug (o release, dipende da come compili)
    Puoi prendere quella directory
    Ultima modifica di URANIO; 30-01-2019 a 11:06

  7. #7
    Utente di HTML.it L'avatar di Rickycast
    Registrato dal
    Apr 2007
    residenza
    CHIERI (TO)
    Messaggi
    263
    Risolto cambiando strada.
    Viste le difficoltà nell'arrivare ad una soluzione utilizzando ReportViewer, ho provato ad utilizzare CrystalReport ed ho ottenuto quello che mi serve. Innanzitutto devo dire che Crystal Report offre molto di più e comunque non è così complicato da utilizzare, poi, che il vero problema è stato soprattutto la mia pigrizia nel non voler provare strade nuove. Questo è il vero errore!
    Comunque, una volta costruito il Report con Crystal Report, per stamparlo in PDF bastano queste poche righe di codice:
    codice:
    Imports System.IO
    Imports System.ComponentModel
    Imports System.Threading
    Imports CrystalDecisions.CrystalReports.Engine
    Imports CrystalDecisions.Shared
    
    Public Class MiaClass
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            Cursor = Cursors.WaitCursor
            Application.DoEvents()
    
            Dim Rpt As New ReportDocument
            Dim DOp As New DiskFileDestinationOptions
    
            ' Per aprire il File PDF sul Desktop
            Dim Dest As String = "C:\Users\" & Environment.UserName & "\Desktop\MioFile.pdf"
    
            ' Occorre indicare il path completo del Report: "C:\MiaDirectory\....." nel mio caso 
            Rpt.Load("C:\MiaDirectory\MioProgetto\MioProgetto\CrystalReport1.rpt", CrystalDecisions.[Shared].OpenReportMethod.OpenReportByDefault)
            DOp.DiskFileName = Dest
            With Rpt.ExportOptions
                .DestinationOptions = DOp
                .ExportDestinationType = ExportDestinationType.DiskFile
                .ExportFormatType = ExportFormatType.PortableDocFormat
            End With
            Rpt.Refresh()
            Application.DoEvents()
            Rpt.Export()
    
            ' Aspetta che il Report venga creato e poi lo apre a video in PDF
            Do Until System.IO.File.Exists(Dest) = True
                Thread.Sleep(100)
            Loop
    
            Process.Start(Dest)
            Cursor = Cursors.Default
    
        End Sub
    End Class

    senza nemmeno la necessità di aprire il Report in una Form.
    Anche l'eseguibile funziona senza problemi, magari è solo un poco lento, però,...
    NOTE: Attenzione ad istanziare gli Imports necessari; probabilmente quelli che ho indicato sono troppi, ma mi servivano anche per altre Sub.
    Io ho utilizzato .NET Framework 4.6.1
    Spero possa servire.
    Saluti.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.