ActiveReports 14 .NET Edition
ActiveReports 14 User Guide / Samples and Walkthroughs / Walkthroughs / Page Report/RDL Report Walkthroughs / Advanced / Custom Resource Locator
In This Topic
    Custom Resource Locator
    In This Topic

    Page reports can get resources from your file system using file paths, but sometimes resources are preserved in very specific sources, such as a database. With page reports, you can create a custom resource locator to read any resources that might be required by your reports from any location. This walkthrough is based on the Custom Resource Locator sample and illustrates how to load pictures from the user's My Pictures directory.

    This walkthrough is split into the following procedures:

    Note: Although this walkthrough uses Page reports, you can also implement this using RDL reports.

    When you complete this walkthrough you get a layout that looks similar to the following at run time.

    Custom Resource Locator

    Custom Resource Locator

    To add an ActiveReports to the Visual Studio project

    1. Create a new Visual Studio Windows Forms Application project.
    2. From the Project menu, select Add New Item.
    3. In the Add New Item dialog that appears, select ActiveReports 14 Page Report and in the Name field, rename the file as DemoReport.rdlx.
    4. Click the Add button to open a new fixed page report.

    To create a layout for the report

    1. From the toolbox, drag an Image control onto the design surface and in the Properties window, set the following properties.
      Property Name Property Value
      Name Image1
      Location 0.1in, 0.1in
      Size 2.8in, 2.8in
      Value MyPictures:Penguins.jpg
    2. From the toolbox, drag another Image control onto the design surface and in the Properties window, set the following properties.
      Property Name Property Value
      Name Image2
      Location 3.1in, 0.1in
      Size 2.8in, 2.8in
      Value MyPictures:Desert.jpg
    3. In the Solution Explorer, select DemoReport.rdlx and in the Properties window, set Build Action to Embedded Resource.

    To add the new MyPicturesLocator class

    1. In the Solution Explorer window, right-click on your project name and select Add and then New Item.
    2. In the Add New Item dialog that appears, select Class.
    3. Change the name of the class to MyPicturesLocator and click the Add button.
    4. Replace the existing code with the following code to the new class.

      To write the code in Visual Basic.NET

      VB code. Paste on TOP
      Copy Code
      Imports System                                                     
      Imports System.Drawing
      Imports GrapeCity.ActiveReports.Extensibility
      Imports System.Globalization
      Imports System.IO
      Imports System.Runtime.InteropServices                                                        
      
      VB code. Paste INSIDE the class
      Copy Code
       Inherits ResourceLocator
      
          Private Const UriSchemeMyImages As String = "MyPictures:"
      
          ' Obtain and return the resource.     
          Public Overrides Function GetResource(resourceInfo As ResourceInfo) As Resource
              Dim name As String = resourceInfo.Name
              If name Is Nothing OrElse name.Length = 0 Then
                  Throw New ArgumentException("The name of resource to be obtained should be non-empty string.", "name")
              End If
              Dim uri As New Uri(name)
              Dim stream As Stream = GetPictureFromSpecialFolder(name)
              If stream Is Nothing Then
                  stream = New MemoryStream()
              End If
              Return New Resource(stream, uri)
          End Function
      
          ' Returns the specified image from Public Pictures folder. 
          Private Shared Function GetPictureFromSpecialFolder(path As String) As Stream
              Dim startPathPos As Integer = UriSchemeMyImages.Length
              If startPathPos >= path.Length Then
                  Return Nothing
              End If
              Dim pictureName As String = path.Substring(startPathPos)
              Dim myPicturesPath As String = Environment.GetEnvironmentVariable("public") & "\Pictures"
              If Not myPicturesPath.EndsWith("\") Then
                  myPicturesPath += "\"
              End If
              Dim picturePath As String = System.IO.Path.Combine(myPicturesPath, pictureName)
              If Not File.Exists(picturePath) Then
                  Return Nothing
              End If
              Dim stream As New MemoryStream()
              Try
                  Dim picture As Image = Image.FromFile(picturePath)
                  picture.Save(stream, picture.RawFormat)
                  stream.Position = 0
              Catch generatedExceptionName As OutOfMemoryException
                  ' The file is not valid image, or GDI+ doesn't support such images.
                  Return Nothing
              Catch generatedExceptionName As ExternalException
                  Return Nothing
          End Try
          Return stream
      End Function                  
      

      To write the code in C#

      C# code. Paste on TOP
      Copy Code
      using System; 
      using System.Drawing; 
      using System.Globalization;
      using System.IO; 
      using System.Runtime.InteropServices; 
      using System.Windows.Forms;
      using GrapeCity.ActiveReports.Extensibility; 
      using your_project_name.Properties;
      
      C# code. Paste BELOW the Using statements
      Copy Code
      namespace your_project_name
      {
          // Look for the resources in My Pictures folder.   
          internal sealed class MyPicturesLocator : ResourceLocator
          {        
              private const string UriSchemeMyImages = "MyPictures:";
              // Obtain and return the resource.     
              public override Resource GetResource(ResourceInfo resourceInfo)
              {
                  string name = resourceInfo.Name;
                  if (name == null || name.Length == 0)
                  {
                      throw new ArgumentException("The name of resource to be obtained should be non-empty string.", "name");
                  }
                  Uri uri = new Uri(name);
                  Stream stream = GetPictureFromSpecialFolder(name);
                  if (stream == null)
                  {
                     stream = new MemoryStream();
                  }
                  return new Resource(stream, uri);
              }
              // Returns the specified image from Public Pictures folder. 
              private static Stream GetPictureFromSpecialFolder(string path)
              {
                  int startPathPos = UriSchemeMyImages.Length;
                  if (startPathPos >= path.ToString().Length)
                  {
                      return null;
                  }
                  string pictureName = path.ToString().Substring(startPathPos);
                  string myPicturesPath = Environment.GetEnvironmentVariable("public") + \\Pictures;
                  if (!myPicturesPath.EndsWith("\\")) myPicturesPath += "\\";
                  string picturePath = Path.Combine(myPicturesPath, pictureName);
                              if (!File.Exists(picturePath)) return null;
                  MemoryStream stream = new MemoryStream();
                  try
                  {
                      Image picture = Image.FromFile(picturePath);
                      picture.Save(stream, picture.RawFormat);
                      stream.Position = 0;
                  }
                  catch (OutOfMemoryException) // The file is not valid image, or GDI+ doesn't support such images. 
                  {
                      return null;
                  }
                  catch (ExternalException)
                  {
                      return null;
                  }
                  return stream;
              }
          }
      }                                                      
      

    To create the PreviewForm

    1. In the Solution Explorer, select the Form1 in the Design view and in the Properties window, set the properties as follows. 
      Property Name Property Value
      Name PreviewForm
      Text Preview Form
      Size 1015, 770
    2. From the Visual Studio toolbox, drag the Viewer control onto the PreviewForm and in the Properties window, set the following properties.
      Property Name Property Value
      Name reportPreview1
      Dock Fill
    3. Double-click the PreviewForm to create an instance for the Load event and add the following code.

      To write the code in Visual Basic.NET

      VB code. Paste BELOW the Import statements
      Copy Code
      Imports GrapeCity.ActiveReports.Document
      Imports System.IO 
      Imports GrapeCity.ActiveReports                                               
      
      VB code. Paste INSIDE the Load event
      Copy Code
      Dim reportData As Stream = [GetType]().Assembly.GetManifestResourceStream("your_project_name.DemoReport.rdlx")
      reportData.Position = 0
      Dim reader As New StreamReader(reportData)
      Dim def As New PageReport(reader)
      def.ResourceLocator = New MyPicturesLocator()
      Dim runtime As New PageDocument(def)
      reportPreview1.ReportViewer.LoadDocument(runtime)
                                              
      

      To write the code in C#

      C# code. Paste BELOW the Using statements
      Copy Code
      using GrapeCity.ActiveReports.Document; 
      using System.IO;
      using GrapeCity.ActiveReports;                                                               
      
      C# code. Paste INSIDE the Load event
      Copy Code
      string myPicturesPath = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures);
      Stream reportData = GetType().Assembly.GetManifestResourceStream("your_project_name.DemoReport.rdlx");
      reportData.Position = 0;
      StreamReader reader = new StreamReader(reportData);
      PageReport def = new PageReport(reader);
      def.ResourceLocator = new MyPicturesLocator();
      PageDocument runtime = new PageDocument(def);
      reportPreview1.ReportViewer.LoadDocument(runtime);
      
    4. Press F5 to run the project.
    See Also

    Page Report Walkthroughs

    Sample ReadMe Files