2016-05-20 6 views
0

Ich erbte ein Programm, das in WPF MVVM Stil mit MVVM Light gemacht wurde. Ich brauche Berichte aus dem Programm aus Daten, die von einem SQL-Server in ViewModels gezogen wurde. Ich mache mir keine Sorgen darüber, MVVM beizubehalten, wenn ich es nicht muss, ich brauche es nur, um zu funktionieren.WPF mit einem Report Viewer Bindungsprobleme

Ich versuche, eines der bereits erstellten ViewModels als meine Daten für den Bericht zu verwenden. Bisher habe ich einen Bericht namens Report1.rdlc erstellt, die die Datenquelle CalibrationViewModel verwendet mit Dataset DataSet1

Ich habe eine Form DemoForm genannt, die auf eine Schaltfläche klicken im Haupt öffnet ein neues Fenster WPF-Seite mit einem Bericht-Viewer (reportViewer1) innerhalb davon. Dies wird verwendet, um den Bericht anzuzeigen. Der ReportViewer ist an CalibrationViewModelBindingSource gebunden.

Auf der DemoForm_Load ich habe

this.reportViewer1.RefreshReport(); 

Ich mag irgendwo fühlen im ein Datenbindung fehlt. Wenn ich versuche, den Bericht hochzuziehen, hat er nur den Header für die drei Felder, die ich in einer Tabelle auf der RDLC zu füllen versuchte. Ich denke, ich muss die DataSource des Berichts einstellen, wenn ich das neue Formular öffne, nur unsicher wie.

Antwort

0

Hier ist ein einfaches Beispiel.

XAML

<Window x:Class="WpfApplication55.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:WpfApplication55" 
     xmlns:rv="clr-namespace:Microsoft.Reporting.WinForms;assembly=Microsoft.ReportViewer.WinForms" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <WindowsFormsHost> 
      <rv:ReportViewer x:Name="reportViewer1" /> 
     </WindowsFormsHost> 
    </Grid> 
</Window> 

CS

using System.Collections.Generic; 
using System.Windows; 

namespace WpfApplication55 
{ 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 

      reportViewer1.LocalReport.ReportEmbeddedResource = "WpfApplication55.Report1.rdlc"; 

      Microsoft.Reporting.WinForms.ReportDataSource reportDataSource1 = new Microsoft.Reporting.WinForms.ReportDataSource(); 
      reportDataSource1.Name = "DataSet1"; 
      reportDataSource1.Value = new List<MyReportData>() { new MyReportData() { Field1 = "Value 1", Field2 = "Value 2" } }; 
      reportViewer1.LocalReport.DataSources.Add(reportDataSource1); 
      reportViewer1.RefreshReport(); 
     } 
    } 

    public class MyReportData 
    { 
     public string Field1 { get; set; } 
     public string Field2 { get; set; } 
    } 
} 

RDLC (Screenshot) enter image description here

Runtime Screenshot enter image description here

+0

Ich habe diesen Teil zu dem Form_Load aber bin nicht sicher, was zu setze h ere - reportDataSource1.Value = Datensatz;/* Verwenden Sie hier Ihre Datenquelle */Meine Quelle ist ein viewModel-Objekt –

+0

In Ihrem Bericht haben Sie eine Datenmenge "DataSet1" eines bestimmten Typs konfiguriert. Setzen Sie den Wert auf eine Instanz dieses Typs. Du hast "CalibrationViewModel" in der Frage erwähnt, also denke ich, dass es ein Beispiel dafür wäre. –

+0

Wenn ich CalibrationViewModel1 als Wert verwende, wird ein Fehler angezeigt, der besagt, dass es im aktuellen Kontext nicht existiert. Dies ist, was ich in die form_load Microsoft.Reporting.WinForms.ReportDataSource reportDataSource1 = new Microsoft.Reporting.WinForms.ReportDataSource(); reportDataSource1.Name = "DataSet2"; reportDataSource1.Value = CalibrationViewModel1; reportViewer1.LocalReport.DataSources.Add (reportDataSource1); reportViewer1.RefreshReport(); –