This is a migrated thread and some comments may be shown as answers.

Problem with DataContext with Q1

3 Answers 201 Views
General Discussions
This is a migrated thread and some comments may be shown as answers.
Samuel
Top achievements
Rank 1
Samuel asked on 26 Sep 2011, 04:38 PM
Hello!
I just update my reporting here, and It won't return the DataContext...
that was my code:
private ReportViewerModel Model
{
    get { return DataContext as ReportViewerModel; }
}
I tried to use this code snippet, but still don't work, 'coz I calling the DataContext in a partial class who complements the ReportViewer class
var layoutRoot = (FrameworkElement)VisualTreeHelper.GetChild(this.ReportViewer1, 0);
var rvm = (ReportViewerModel)(layoutRoot.DataContext);

I need to call the DataContext to print my report.. I can see it, in reportviewer, but can't print...
There's something I can do?

3 Answers, 1 is accepted

Sort by
0
Peter
Telerik team
answered on 29 Sep 2011, 04:22 PM
Hello Samuel,

If the report viewer template has not yet been created this could cause the unexpected behavior. To make sure the template is available use OnApplyTemplate or similar event:

public partial class MainPage : UserControl
   {
       public MainPage()
       {
           InitializeComponent();
       }
  
       public override void OnApplyTemplate()
       {
           base.OnApplyTemplate();
           this.ReportViewer1.PrintTheReport();
       }
   }
  
   static class ReportViewerExtensions
   {
       public static void PrintTheReport(thisReportViewer reportViewer)
       {
           var layoutRoot = (FrameworkElement)VisualTreeHelper.GetChild(reportViewer, 0);
           var viewerModel = (ReportViewerModel)layoutRoot.DataContext;
           var printCommand = viewerModel.PrintReportCommand;
           if(printCommand.CanExecute(null))
           {
               printCommand.Execute(null);
           }
       }
   }

If you are just after the report printing functionality you can avoid the Silverlight report viewer and implement your own Silverlight report printing functionality as shown in the following code snippet:

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
using System.Text;
using System.Windows.Controls;
using System.Windows.Markup;
using System.Windows.Printing;
using Telerik.ReportViewer.Silverlight;
using Telerik.Reporting.Service.SilverlightClient;
using Telerik.Reporting.Service;
using System.ComponentModel;
 
namespace Reports
{
    public partial class MainPage1 : UserControl
    {
        string reportName = "Telerik.Reporting.Examples.CSharp.Invoice, CSharp.ReportLibrary";
        List<Canvas> pages;
        ReportServiceClient serviceClient;
        string instanceID;
        PrintDocument printDocument;
        int pageCountToPrint;
 
        public MainPage1()
        {
            InitializeComponent();
 
            this.printDocument = new PrintDocument();
 
            Uri serviceUri = new Uri(App.Current.Host.Source, "../ReportService.svc");
            this.serviceClient = new ReportServiceClient(serviceUri);
            this.serviceClient.RenderAndCacheCompleted += RenderAndCacheCompleted;
            this.serviceClient.GetPageCompleted += new EventHandler<GetPageEventArgs>(ServiceClientGetPageCompleted);
        }
 
        void button1_Click(object sender, RoutedEventArgs e)
        {
            this.button1.IsEnabled = false;
            this.pagesList = new Collection<Canvas>();
            var parameters = new NameValueDictionary();
            this.serviceClient.RenderAndCacheAsync("XAML", reportName, null, parameters);
            this.pageCountToPrint = 0;
        }
 
        void RenderAndCacheCompleted(object sender, RenderAndCacheEventArgs e)
        {
            this.instanceID = e.RenderingResult.InstanceID;
            int pageCount;
            for (pageCount = 1; pageCount <= e.RenderingResult.PageCount; pageCount++, pageCountToPrint++)
            {
                this.serviceClient.GetPageAsync(instanceID, pageCount);
            }
            this.pages = new List<Canvas>(pageCount);
            int index = 0;
            this.printDocument.PrintPage += (s, arg) =>
            {
                var currentPrintPageNumber = ((PrintDocument)s).PrintedPageCount + 1;
                arg.PageVisual = this.pages[currentPrintPageNumber-1];
                arg.HasMorePages = (currentPrintPageNumber < this.pages.Count);
            };
        }
 
        void ServiceClientGetPageCompleted(object sender, GetPageEventArgs e)
        {
            var result = e.PageInfo;
            using (var ms = new MemoryStream(result.Buffer))
            using (var sr = new StreamReader(ms, Encoding.Unicode))
            {
                var pageRoot = XamlReader.Load(sr.ReadToEnd());
                this.pages.Add((Canvas)pageRoot);
            }
            pageCountToPrint--;
            System.Diagnostics.Debug.WriteLine(e.PageInfo.PageNumber);
            if (this.pageCountToPrint == 0)
            {
                button2.IsEnabled = true;
            }
        }
 
        void button2_Click(object sender, RoutedEventArgs e)
        {
            this.button1.IsEnabled = true;
            this.button2.IsEnabled = false;
            this.printDocument.Print("document");
        }
    }
}

If you experience any further difficulties we will appreciate if you open a support thread and send us the problematic project to review locally.

Greetings,
Peter
the Telerik team

Explore the entire Telerik portfolio by downloading the Ultimate Collection trial package. Get it now >>

0
Kishore
Top achievements
Rank 1
answered on 10 Nov 2011, 10:53 AM
Earlier i too have the same problem in accesing the reportviewermodel. By the solution u provided I am able to print the reportviewer, but the problem is I am using NeedDataSource event for providing the datasource to the report which is not firing in Print. When i tried to update the Report parameters using viewerModel.ApplyReportParametersCommand.Execute(null);  before the print then the print is not working.

  public partial class ReportViewer : Page, IReportServiceClientFactory
    {
        public ReportSettingsDTO ReportParametersObject { get; set; }




        public ReportViewer()
        {
            InitializeComponent();
            this.rptViewer.ReportServiceClientFactory = this;
            this.rptViewer.RenderBegin += new RenderBeginEventHandler(rptViewer_RenderBegin);


        }


        void rptViewer_RenderBegin(object sender, RenderBeginEventArgs args)
        {
            args.ParameterValues["ParameterObject"] = serialize();
        }
        public string serialize()
        {
            MemoryStream ms = new MemoryStream();


            // Serializer the User object to the stream.
            DataContractSerializer ser = new DataContractSerializer(typeof(ReportSettingsDTO));
            ser.WriteObject(ms, ReportParametersObject);
            byte[] array = ms.ToArray();
            ms.Close();
            return Encoding.UTF8.GetString(array, 0, array.Length);
        }


       


        #region IReportServiceClientFactory Members


        ReportServiceClient IReportServiceClientFactory.Create(System.Uri remoteAddress)
        {
            var binding = new BasicHttpBinding()
            {
                MaxBufferSize = int.MaxValue,
                MaxReceivedMessageSize = int.MaxValue,
                ReceiveTimeout = new TimeSpan(0, 15, 0),
                SendTimeout = new TimeSpan(0, 15, 0)
            };


            var endpointAddress = new EndpointAddress(remoteAddress);


            return new ReportServiceClient(binding, endpointAddress);


        }




        #endregion


        private void button2_Click(object sender, RoutedEventArgs e)
        {
            this.rptViewer.PrintTheReport();
        }




    }
    static class ReportViewerExtensions
    {
        public static void PrintTheReport(this Telerik.ReportViewer.Silverlight.ReportViewer reportViewer)
        {
            var layoutRoot = (FrameworkElement)VisualTreeHelper.GetChild(reportViewer, 0);
            var viewerModel = (ReportViewerModel)layoutRoot.DataContext;
            var printCommand = viewerModel.PrintReportCommand;
            if (printCommand.CanExecute(null))
            {
                viewerModel.ApplyReportParametersCommand.Execute(null);
                printCommand.Execute(null);
            }
        }
    }

awaiting for the solution.. 

0
Peter
Telerik team
answered on 14 Nov 2011, 09:58 AM
Hello Kishore,

The NeedDataSource event is meant to be used only for providing data source to the data item and that data source is cached unless changed i.e. once cached the NeedDataSource event is not fired again and as you probably know every time the report is previewed, paged or exported through the viewer it is processed and rendered from scratch. During this processing, the cached data source is used, but the Values you have set in NeedDataSource are not  being set as the event is not fired second time. That is why any other changes to report items or parameters should be moved to ItemDataBinding event, which is fired regardless.

All the best,
Peter
the Telerik team

Q2’11 SP1 of Telerik Reporting is available for download (see what's new). Get it today.

Tags
General Discussions
Asked by
Samuel
Top achievements
Rank 1
Answers by
Peter
Telerik team
Kishore
Top achievements
Rank 1
Share this question
or