Mehrseitiges Drucken mit Silverlight Teil 1

Viele Wege führen nach Rom. So auch beim Ausdrucken von Daten. Persönlich würde ich immer ein Reporting Tool, ala SQL Reporting Services wählen, um formatierte Ausdrucke zu erzeugen. Nichts desto trotz lässt sich mit Aufwand auch aus Silverlight drucken. Es gibt allerdings keine Report Designer! Entsprechend arbeiten die meisten Beispiele mit reinem Source Code um die Daten Reports zu erstellen. Das man bestehende Usercontrols recht einfach ausdrucken kann, habe ich bereits in meinem vorigen Blog Post gezeigt. Nicht besonders schön und generell uncool per Code zu drucken.

Folglich habe ich in meinen Beispiel eine XAML Page erstellt, die mir als Print Template dient. Vorerst ganz einfach.

<Grid Name="Layoutroot" >
   <sdk:DataGrid VerticalAlignment="Center"
  HorizontalAlignment="Center" Margin="20" 
x:Name="datagrid1" ItemsSource="{Binding}" 
                      >
   <sdk:DataGrid.Style>
       <Style TargetType="sdk:DataGrid">
           <Setter Property="HorizontalScrollBarVisibility" Value="Disabled"/>
           <Setter Property="VerticalScrollBarVisibility" Value="Disabled"/>
       </Style>
   </sdk:DataGrid.Style>
</sdk:DataGrid>
</Grid>

Die Daten werden vom Benutzer geladen und dann mit einem extra Button ausgedruckt.

image

Eine Seite zu drucken ist auch supereinfach zu erledigen. Der einzige Trick, ich reiche per Datacontext die Liste der Kunden durch und weise per Binding diese der Itemsource (siehe obiges XAML) wieder zu.

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) 
Handles Button2.Click Dim doc As PrintDocument = New PrintDocument() AddHandler doc.PrintPage, AddressOf doc_PrintPage doc.Print("KundenListe") End Sub Private Sub doc_PrintPage(ByVal sender As Object, ByVal e As PrintPageEventArgs) Dim p As New printPage59 p.DataContext = DataGrid1.ItemsSource p.Height = e.PrintableArea.Height p.Width = e.PrintableArea.Width e.PageVisual = p End Sub

Ab hier wird es ein wenig peinlich. Wie stellt man fest, das man einen neue Seite drucken soll. Man könnte das aufwendig ausrechnen. Ich werde das auch sicher nochmal später in einem Beispiel tun. Vorerst habe ich einfach gezählt, wie viele Datensätze auf eine Seite passen. Dann kann man mit PageCounter und einem Linq Statement ganz einfach in der Datenmenge Pagen. Die nächste Seite druckt man per HasMorePages

 Dim PageCounter As Integer = 0
 Private Sub doc_PrintPage(ByVal sender As Object, ByVal e As PrintPageEventArgs)
   Dim p As New printPage59
   Dim c As List(Of Customers) = DataGrid1.ItemsSource
   p.DataContext = c.Skip(PageCounter * 44).Take(44)
   '1122.0 printablearea , 44 Zeilen gezählt
   p.Height = e.PrintableArea.Height
   p.Width = e.PrintableArea.Width
   e.PageVisual = p
   If PageCounter * 44 < c.Count Then
       e.HasMorePages = True
       PageCounter += 1
    End If
 End Sub

Und so sieht das dann in etwas aus.

image

Pingbacks and trackbacks (1)+

Kommentar schreiben