Domanda

Sto usando cristallo per visualizzare i rapporti nel mio progetto, e mi piacerebbe essere in grado di visualizzare una piccola anteprima o miniatura dell'immagine del rapporto per l'utente quando lui o lei è in ripresa un report per visualizzare dal mio UI. C'è un modo per produrre queste miniature dinamicamente da codice?

L'utente ha la possibilità di aggiungere o rimuovere i rapporti con l'aggiunta o rimuoverli dalla cartella rapporti, quindi basta fare tutte le immagini in miniatura a mano non è davvero un'opzione.

È stato utile?

Soluzione

Ho usato l'oggetto Dsofile per ottenere la miniatura all'interno del rapporto poi utilizzato AxHost per convertire l'oggetto restituito ad un'immagine ho potuto visualizzare. Questa non era la soluzione che volevo, ma la Dsofile è liberamente distribuibile quindi credo che questo funzionerà finché non trovo qualcosa di meglio.

  1. Scarica e installare il DLL Dsofile da Microsoft.
  2. Aggiungi un riferimento alla ** DSO OLE Document Properties Reader 2.1
  3. codice

Ecco il mio codice, riduceva al minimo indispensabile:

  namespace Ibs.Ui.OrderPrint
  {
    public partial class OrderPrintEdit
    {
       public OrderPrintEdit()
       {
        InitializeComponent();
       }

       #region -- reports_SelectedIndexChanged(sender, e) Event Handler --
       private void reports_SelectedIndexChanged(object sender, EventArgs e)
       {
           try
           {
               DSOFile.OleDocumentPropertiesClass oleDocumentPropertiesClass = new DSOFile.OleDocumentPropertiesClass();
               DirectoryInfo reportDirectory = new DirectoryInfo(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + "\\Reports");
               oleDocumentPropertiesClass.Open(reportDirectory + "\\" + reports.Text,true,DSOFile.dsoFileOpenOptions.dsoOptionDontAutoCreate);
               Object thumbnail = oleDocumentPropertiesClass.SummaryProperties.Thumbnail;
               if (thumbnail != null)
               {
                   reportThumbnail.BackgroundImage = IPictureDispHost.GetPictureFromIPicture(thumbnail);
               }
               else
               {
                   reportThumbnail.BackgroundImage = null;
               }
               oleDocumentPropertiesClass.Close(false);
           }
           catch (Exception ex)
           {
           }
       }
       #endregion
   }

   internal sealed class IPictureDispHost : AxHost
   {
       private IPictureDispHost() : base("{63109182-966B-4e3c-A8B2-8BC4A88D221C}")
       {
       }
       /// <summary>
       /// Convert the dispatch interface into an image object.
       /// </summary>
       /// <param name="picture">The picture interface</param>
       /// <returns>An image instance.</returns>
       public new static Image GetPictureFromIPicture(object picture)
       {
           return AxHost.GetPictureFromIPicture(picture);
       }
   }

}

sto riempiendo una casella combinata con i nomi dei report sul carico modulo. Nel caso in SelectedIndexChanged ottengo l'oggetto Thumbnail dal rapporto e passarlo al metodo di conversione. Questo dovrebbe funzionare per i documenti di Office troppo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top