none
Reporting Services VMMV RRS feed

  • Pregunta

  • saludos gracias a los que lean y sobre todo a los que respondan el tema es el siguiente:

    siguiendo los pasos de este enlace se puede mostrar el reportviewer en una aplicación WPF sin embargo he tratado de convertirla a WPF y no se cual es la propiedad para enlazar el reportviewer con la clase que lo gestiona, en el proyecto que se ha creado tiene este codigo

    archivo Window1.xaml

    <Window x:Class="Demo4.Window1"
    	 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:viewer="clr-namespace:Microsoft.Reporting.WinForms;assembly=Microsoft.ReportViewer.WinForms"      
        Title="Reporte de Prueba" Height="390" Width="555">
        <Grid>
            <WindowsFormsHost >
                <viewer:ReportViewer x:Name ="reportViewer1" />
            </WindowsFormsHost>
        </Grid>
    </Window>

    archivo VmReporte.cs

    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Linq;
    using System.Windows.Forms;
    using Microsoft.Reporting.WinForms;
    
    namespace Reportes
    {
        public class VmReporte : INotifyPropertyChanged
        {
            private ReportDataSource _subReporteData;
            private string _subReporteDataSource;
            private string _subReporteDataMenber;
            private ReportViewer _visor;
            private string _titulo;
    
            public event PropertyChangedEventHandler PropertyChanged;
    
            protected virtual void OnPropertyChanged(string propertyName)
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
            }
    
            public ReportDataSource SubReporteData
            {
                get { return _subReporteData; }
                set
                {
                    if (_subReporteData == value) return;
                    _subReporteData = value;
                    OnPropertyChanged("SubReporteData");
                }
            }
    
            public string SubReportedataSource
            {
                get { return _subReporteDataSource; }
                set
                {
                    if (_subReporteDataSource == value) return;
                    _subReporteDataSource = value;
                    OnPropertyChanged("SubReportedataSource");
                }
            }
    
            public string SubReportedataMenber
            {
                get { return _subReporteDataMenber; }
                set
                {
                    if (_subReporteDataMenber == value) return;
                    _subReporteDataMenber = value;
                    OnPropertyChanged("SubReportedataMenber");
                }
            }
    
            public ReportViewer Visor
            {
                get { return _visor; }
                set
                {
                    if (_visor == value) return;
                    _visor = value;
                    OnPropertyChanged("Visor");
                }
            }
    
            public string Titulo
            {
                get { return _titulo; }
                set
                {
                    if (_titulo == value) return;
                    _titulo = value;
                    OnPropertyChanged("Titulo");
                }
            }
    
            public VmReporte(string titulo)
            {
                Titulo = titulo;
                SubReportedataMenber = string.Empty;
                SubReportedataSource = string.Empty;
                SubReporteData = new ReportDataSource();
            }
    
            private void MostrarReporte(IWin32Window sender)
            {
                Visor.RefreshReport();
            }
    
            public void ConfigurarSubReporte(BindingSource bindingSource, string dataSource, string dataMember)
            {
                SubReporteData = new ReportDataSource(dataSource, bindingSource.DataSource);
                SubReportedataMenber = dataMember;
                SubReportedataSource = dataSource;
                Visor.LocalReport.SubreportProcessing += AsignarSubreporteData;
            }
    
            public void AsignarSubreporteData(object sender, SubreportProcessingEventArgs e)
            {
                e.DataSources.Add(SubReporteData);
                if (SubReportedataMenber != string.Empty)
                {
                    ((BindingSource)e.DataSources[SubReportedataSource].Value).DataMember = SubReportedataMenber;
                }
            }
    
            public void MostrarReporte(BindingSource bindingSource, string nombreOrigenDatos, string dataMember, string rutaReporte, IWin32Window sender)
            {
                var reportDataSource = new ReportDataSource(nombreOrigenDatos, bindingSource.DataSource);
                ((BindingSource)reportDataSource.Value).DataMember = dataMember;
                Visor.ProcessingMode = ProcessingMode.Local;
                Visor.LocalReport.ReportPath = rutaReporte;
                Visor.LocalReport.DataSources.Add(reportDataSource);
                MostrarReporte(sender);
            }
        }
    }
    

    como verán no encuentro la manera de enlazar el visor con el control reportviewer para que tenga el comportamiento adecuado

    gracias por las respuestas

    Americo

    viernes, 19 de octubre de 2012 15:17

Respuestas

  • Bueno estimados aca les dejo la solucion al problema por si a alguien le interesa cambie la vista para que soportara un content presenter y quedo de esta manera

    <Window x:Class="Demo4.Window1"
    	 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        Title="{Binding Path=Titulo}" Height="390" Width="555">
        <Grid>
    		<ContentPresenter Content="{Binding Path=Visor}" />
        </Grid>
    </Window>
    luego se modifico la clase para que soportara el content presenter
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Linq;
    using System.Windows.Forms;
    using System.Windows.Forms.Integration;
    using Microsoft.Reporting.WinForms;
    
    namespace Demo4
    {
        /// <summary>
        /// Description of VmReporte.
        /// </summary>
        public class VmReporte : INotifyPropertyChanged
        {
            private ReportDataSource _subReporteData;
            private string _subReporteDataSource;
            private string _subReporteDataMember;
            private WindowsFormsHost _visor;
            private readonly ReportViewer _reportViewer;
            private string _titulo;
    
            public event PropertyChangedEventHandler PropertyChanged;
    
            protected virtual void OnPropertyChanged(string propertyName)
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
            }
    
            public WindowsFormsHost Visor
            {
                get { return _visor; }
                set
                {
                    _visor = value;
                    OnPropertyChanged("Visor");
                }
            }
    
            public string Titulo
            {
                get { return _titulo; }
                set
                {
                    if (_titulo == value) return;
                    _titulo = value;
                    OnPropertyChanged("Titulo");
                }
            }
    
            public VmReporte(string titulo)
            {
                Titulo = titulo;
                _reportViewer = new ReportViewer {ShowRefreshButton = false};
            }
    
            private void AsignarReportViewerToWindowsFormHost()
            {
                var windowsFormsHost = new WindowsFormsHost {Child = _reportViewer};
                _reportViewer.RefreshReport();
                Visor = windowsFormsHost;
            }
    
            public void ConfigurarSubReporte(BindingSource bindingSource, string dataSource, string dataMember)
            {
                _subReporteData = new ReportDataSource(dataSource, bindingSource.DataSource);
                _subReporteDataMember = dataMember;
                _subReporteDataSource = dataSource;
                _reportViewer.LocalReport.SubreportProcessing += AsignarSubReporteData;
            }
    
            public void AsignarSubReporteData(object sender, SubreportProcessingEventArgs e)
            {
                e.DataSources.Add(_subReporteData);
                if (_subReporteDataMember != string.Empty)
                {
                    ((BindingSource)e.DataSources[_subReporteDataSource].Value).DataMember = _subReporteDataMember;
                }
            }        public void MostrarReporte(BindingSource bindingSource, string nombreOrigenDatos, string dataMember, string rutaReporte)
            {
                var reportDataSource = new ReportDataSource(nombreOrigenDatos, bindingSource.DataSource);
                ((BindingSource)reportDataSource.Value).DataMember = dataMember;
                _reportViewer.ProcessingMode = ProcessingMode.Local;
                _reportViewer.LocalReport.ReportPath = rutaReporte;
                _reportViewer.LocalReport.DataSources.Add(reportDataSource);
                AsignarReportViewerToWindowsFormHost();
            }
        }
    }
    finalmente se utiliza la clase asi
    var vmReporte = new VmReporte("Visor de prueba");
    vmReporte.ConfigurarSubReporte(bsVoucherDetalle, "dsDCVoucherCaptacionesDetalle", "Detalle");
    vmReporte.MostrarReporte(bsVoucher, "dsDCVoucherCaptaciones", "", ruta, lstParametos);
    var reporte = new Window1 {DataContext = vmReporte};
    reporte.Show();
    donde bsVourcherDetalle la data para el detalle del reporte para el subreporte y bsVoucher es la data del reporte

    espero les sea util

    Americo

    • Editado AmericoES lunes, 29 de octubre de 2012 23:41 se preciono enter por error
    • Marcado como respuesta AmericoES lunes, 29 de octubre de 2012 23:41
    lunes, 29 de octubre de 2012 23:36