在WPF中打印DataGrid中的所有数据

我正在研究WPF应用程序。 我在DataGrid中有数据,我必须打印其中的所有数据。 我试过这个……

publicMainWindow() { InitializeComponent(); DataTabledt = newDataTable(); dt.Columns.Add("S.No"); dt.Columns.Add("Name"); dt.Columns.Add("Father's Name"); dt.Columns.Add("DOB"); dt.Columns.Add("Qualification"); dt.Columns.Add("Gender"); dt.Columns.Add("SSC %"); dt.Columns.Add("+2 %"); dt.Columns.Add("Graduation %"); dt.Columns.Add("Work Experience"); dt.Columns.Add("Company"); object[] rowValues = {"01","Gopi","Ravi","31","Degree","M", "88","85", "80","2 Years","Blah Blah"}; dt.Rows.Add(rowValues); dt.AcceptChanges(); myGrid.DataContext = dt.DefaultView; } privatevoidPrint_Click(object sender, RoutedEventArgs e) { PrintDialogprintDlg = newPrintDialog(); if ((bool)printDlg.ShowDialog().GetValueOrDefault()) { Sizepagesize = newSize(printDlg.PrintableAreaWidth,printDlg.PrintableAreaHeight); myGrid.Measure(pagesize); myGrid.Arrange(newRect(5, 5, pagesize.Width, pagesize.Height)); printDlg.PrintVisual(myGrid, "Personal Information"); } } 

当我点击打印按钮时,它只打印我们可以看到的数据,如下所示 在此处输入图像描述

但就我而言,它不是印刷工作经验和公司专栏。 如何打印所有字段。 请帮帮我

编辑:我认为使用FlowDocument,但假设我有50行我不能使用FlowDocument。 在这种情况下如何打印。

我使用这个:

  // Author : Kadi Okba public class WpfPrinting { public const double cm = 37; public double Margin = 0.5 * cm; public double PageWidth = 21 * cm; public double PageHeight = 29 * cm; public double RowHeight = 0.7 * cm; public bool PageNumberVisibility = true; public bool DateVisibility = true; public double FontSize = 14; public double HeaderFontSize = 14; public bool IsBold = false; public void PrintDataGrid(FrameworkElement header, DataGrid grid, FrameworkElement footer, PrintDialog printDialog) { if (header == null) { header = new FrameworkElement(); header.Width = 1; header.Height = 1; } if (footer == null) { footer = new FrameworkElement(); footer.Width = 1; footer.Height = 1; } if (grid == null) return; Size pageSize = new Size(PageWidth, PageHeight); FixedDocument fixedDoc = new FixedDocument(); fixedDoc.DocumentPaginator.PageSize = pageSize; double GridActualWidth = grid.ActualWidth == 0 ? grid.Width : grid.ActualWidth; double PageWidthWithMargin = pageSize.Width - Margin * 2; double PageHeightWithMargin = pageSize.Height - Margin * 2; // scale the header double headerScale = (header?.Width ?? 0) / PageWidthWithMargin; double headerWidth = PageWidthWithMargin; double headerHeight = (header?.Height ?? 0) * headerScale; header.Height = headerHeight; header.Width = headerWidth; // scale the footer double footerScale = (footer?.Width ?? 0) / PageWidthWithMargin; double footerWidth = PageWidthWithMargin; double footerHeight = (footer?.Height ?? 0) * footerScale; footer.Height = footerHeight; footer.Width = footerWidth; int pageNumber = 1; string Now = DateTime.Now.ToShortDateString(); //add the header FixedPage fixedPage = new FixedPage(); fixedPage.Background = Brushes.White; fixedPage.Width = pageSize.Width; fixedPage.Height = pageSize.Height; FixedPage.SetTop(header, Margin); FixedPage.SetLeft(header, Margin); fixedPage.Children.Add(header); // its like cursor for current page Height to start add grid rows double CurrentPageHeight = headerHeight + 1 * cm; int lastRowIndex = 0; bool IsFooterAdded = false; for (;;) { int AvaliableRowNumber; var SpaceNeededForRestRows = (CurrentPageHeight + (grid.Items.Count - lastRowIndex) * RowHeight); //To avoid printing the footer in a separate page if (SpaceNeededForRestRows > (pageSize.Height - footerHeight - Margin) && (SpaceNeededForRestRows < (pageSize.Height - Margin))) AvaliableRowNumber = (int)((pageSize.Height - CurrentPageHeight - Margin - footerHeight) / RowHeight); // calc the Avaliable Row acording to CurrentPageHeight else AvaliableRowNumber = (int)((pageSize.Height - CurrentPageHeight - Margin) / RowHeight); // create new page except first page cause we created it prev if (pageNumber > 1) { fixedPage = new FixedPage(); fixedPage.Background = Brushes.White; fixedPage.Width = pageSize.Width; fixedPage.Height = pageSize.Height; } // create new data grid with columns width and binding DataGrid gridToAdd; gridToAdd = GetDataGrid(grid, GridActualWidth, PageWidthWithMargin); FixedPage.SetTop(gridToAdd, CurrentPageHeight); // top margin FixedPage.SetLeft(gridToAdd, Margin); // left margin // add the avaliable rows to the cuurent grid for (int i = lastRowIndex; i < grid.Items.Count && i < AvaliableRowNumber + lastRowIndex; i++) { gridToAdd.Items.Add(grid.Items[i]); } lastRowIndex += gridToAdd.Items.Count + 1; // add date TextBlock dateText = new TextBlock(); if (DateVisibility) dateText.Visibility = Visibility.Visible; else dateText.Visibility = Visibility.Hidden; dateText.Text = Now; // add page number TextBlock PageNumberText = new TextBlock(); if (PageNumberVisibility) PageNumberText.Visibility = Visibility.Visible; else PageNumberText.Visibility = Visibility.Hidden; PageNumberText.Text = "Page : " + pageNumber; FixedPage.SetTop(dateText, PageHeightWithMargin); FixedPage.SetLeft(dateText, Margin); FixedPage.SetTop(PageNumberText, PageHeightWithMargin); FixedPage.SetLeft(PageNumberText, PageWidthWithMargin - PageNumberText.Text.Length * 10); fixedPage.Children.Add(gridToAdd); fixedPage.Children.Add(dateText); fixedPage.Children.Add(PageNumberText); // calc Current Page Height to know the rest Height of this page CurrentPageHeight += gridToAdd.Items.Count * RowHeight; // all grid rows added if (lastRowIndex >= grid.Items.Count) { // if footer have space it will be added to the same page if (footerHeight < (PageHeightWithMargin - CurrentPageHeight)) { FixedPage.SetTop(footer, CurrentPageHeight + Margin); FixedPage.SetLeft(footer, Margin); fixedPage.Children.Add(footer); IsFooterAdded = true; } } fixedPage.Measure(pageSize); fixedPage.Arrange(new Rect(new Point(), pageSize)); fixedPage.UpdateLayout(); PageContent pageContent = new PageContent(); ((IAddChild)pageContent).AddChild(fixedPage); fixedDoc.Pages.Add(pageContent); pageNumber++; // go to start position : New page Top CurrentPageHeight = Margin; // this mean that lastRowIndex >= grid.Items.Count and the footer dont have enough space if (lastRowIndex >= grid.Items.Count && !IsFooterAdded) { FixedPage ffixedPage = new FixedPage(); ffixedPage.Background = Brushes.White; ffixedPage.Width = pageSize.Width; ffixedPage.Height = pageSize.Height; FixedPage.SetTop(footer, Margin); FixedPage.SetLeft(footer, Margin); TextBlock fdateText = new TextBlock(); if (DateVisibility) fdateText.Visibility = Visibility.Visible; else fdateText.Visibility = Visibility.Hidden; dateText.Text = Now; TextBlock fPageNumberText = new TextBlock(); if (PageNumberVisibility) fPageNumberText.Visibility = Visibility.Visible; else fPageNumberText.Visibility = Visibility.Hidden; fPageNumberText.Text = "Page : " + pageNumber; FixedPage.SetTop(fdateText, PageHeightWithMargin); FixedPage.SetLeft(fdateText, Margin); FixedPage.SetTop(fPageNumberText, PageHeightWithMargin); FixedPage.SetLeft(fPageNumberText, PageWidthWithMargin - PageNumberText.ActualWidth); ffixedPage.Children.Add(footer); ffixedPage.Children.Add(fdateText); ffixedPage.Children.Add(fPageNumberText); ffixedPage.Measure(pageSize); ffixedPage.Arrange(new Rect(new Point(), pageSize)); ffixedPage.UpdateLayout(); PageContent fpageContent = new PageContent(); ((IAddChild)fpageContent).AddChild(ffixedPage); fixedDoc.Pages.Add(fpageContent); IsFooterAdded = true; } if (IsFooterAdded) { break; } } PrintFixedDocument(fixedDoc, printDialog); } private DataGrid GetDataGrid(DataGrid grid, double GridActualWidth, double PageWidthWithMargin) { DataGrid printed = new DataGrid(); // styling the grid Style rowStyle = new Style(typeof(DataGridRow)); rowStyle.Setters.Add(new Setter(Control.BackgroundProperty, Brushes.White)); rowStyle.Setters.Add(new Setter(Control.FontSizeProperty, FontSize)); if (IsBold) rowStyle.Setters.Add(new Setter(Control.FontWeightProperty, FontWeights.Bold)); rowStyle.Setters.Add(new Setter(Control.HeightProperty, RowHeight)); Style columnStyle = new Style(typeof(DataGridColumnHeader)); columnStyle.Setters.Add(new Setter(Control.FontSizeProperty, HeaderFontSize)); columnStyle.Setters.Add(new Setter(Control.HorizontalContentAlignmentProperty, HorizontalAlignment.Center)); columnStyle.Setters.Add(new Setter(Control.BorderThicknessProperty, new Thickness(0, 0.5, 0, 1.5))); columnStyle.Setters.Add(new Setter(Control.BackgroundProperty, Brushes.White)); columnStyle.Setters.Add(new Setter(Control.BorderBrushProperty, Brushes.Black)); columnStyle.Setters.Add(new Setter(Control.FontWeightProperty, FontWeights.SemiBold)); printed.RowStyle = rowStyle; printed.VerticalGridLinesBrush = Brushes.Black; printed.HorizontalGridLinesBrush = Brushes.Black; printed.FontFamily = new FontFamily("Arial"); printed.RowBackground = Brushes.White; printed.Background = Brushes.White; printed.Foreground = Brushes.Black; // get the columns of grid foreach (var column in grid.Columns) { if (column.Visibility != Visibility.Visible) continue; DataGridTextColumn textColumn = new DataGridTextColumn(); textColumn.HeaderStyle = columnStyle; textColumn.Header = column.Header; textColumn.Width = column.ActualWidth / GridActualWidth * PageWidthWithMargin; textColumn.Binding = ((DataGridTextColumn)column).Binding; printed.Columns.Add(textColumn); } printed.BorderBrush = Brushes.Black; return printed; } public void PrintFixedDocument(FixedDocument fixedDoc, PrintDialog printDialog) { XpsDocumentWriter writer = PrintQueue.CreateXpsDocumentWriter(printDialog.PrintQueue); writer.Write(fixedDoc, printDialog.PrintTicket); } } 

我最近完成了代码。它是经过测试的代码。它将打印所有记录的每个数据网格。它是简单而简单的代码。你会添加一个类。如果你想装饰一个数据网格然后去PrintDG类然后根据它来装饰它自己的要求。
跟着这些步骤。
第1步:在顶部添加这些引用。

  using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Media; 

第2步:添加类PrintDG.cs。

  public class PrintDG { public void printDG(DataGrid dataGrid, string title) { PrintDialog printDialog = new PrintDialog(); if (printDialog.ShowDialog() == true) { FlowDocument fd = new FlowDocument(); Paragraph p = new Paragraph(new Run(title)); p.FontStyle = dataGrid.FontStyle; p.FontFamily = dataGrid.FontFamily; p.FontSize = 18; fd.Blocks.Add(p); Table table = new Table(); TableRowGroup tableRowGroup = new TableRowGroup(); TableRow r = new TableRow(); fd.PageWidth = printDialog.PrintableAreaWidth; fd.PageHeight = printDialog.PrintableAreaHeight; fd.BringIntoView(); fd.TextAlignment = TextAlignment.Center; fd.ColumnWidth = 500; table.CellSpacing = 0; var headerList = dataGrid.Columns.Select(e => e.Header.ToString()).ToList(); List bindList = new List(); for (int j = 0; j < headerList.Count; j++) { r.Cells.Add(new TableCell(new Paragraph(new Run(headerList[j])))); r.Cells[j].ColumnSpan = 4; r.Cells[j].Padding = new Thickness(4); r.Cells[j].BorderBrush = Brushes.Black; r.Cells[j].FontWeight = FontWeights.Bold; r.Cells[j].Background = Brushes.DarkGray; r.Cells[j].Foreground = Brushes.White; r.Cells[j].BorderThickness = new Thickness(1, 1, 1, 1); var binding = (dataGrid.Columns[j] as DataGridBoundColumn).Binding as Binding; bindList.Add(binding.Path.Path); } tableRowGroup.Rows.Add(r); table.RowGroups.Add(tableRowGroup); for (int i = 0; i < dataGrid.Items.Count; i++) { dynamic row; if (dataGrid.ItemsSource.ToString().ToLower() == "system.data.linqdataview") { row = (DataRowView)dataGrid.Items.GetItemAt(i); } else { row = (BalanceClient)dataGrid.Items.GetItemAt(i); } table.BorderBrush = Brushes.Gray; table.BorderThickness = new Thickness(1, 1, 0, 0); table.FontStyle = dataGrid.FontStyle; table.FontFamily = dataGrid.FontFamily; table.FontSize = 13; tableRowGroup = new TableRowGroup(); r = new TableRow(); for (int j = 0; j < row.Row.ItemArray.Count(); j++) { if (dataGrid.ItemsSource.ToString().ToLower() == "system.data.linqdataview") { r.Cells.Add(new TableCell(new Paragraph(new Run(row.Row.ItemArray[j].ToString())))); } else { r.Cells.Add(new TableCell(new Paragraph(new Run(row.GetType().GetProperty(bindList[j]).GetValue(row, null))))); } r.Cells[j].ColumnSpan = 4; r.Cells[j].Padding = new Thickness(4); r.Cells[j].BorderBrush = Brushes.DarkGray; r.Cells[j].BorderThickness = new Thickness(0, 0, 1, 1); } tableRowGroup.Rows.Add(r); table.RowGroups.Add(tableRowGroup); } fd.Blocks.Add(table); printDialog.PrintDocument(((IDocumentPaginatorSource)fd).DocumentPaginator, ""); } } } 

Step2:然后去打印按钮点击事件并创建PrintDG类的对象然后调用printDG传递给它两个参数datagridname和title。
喜欢 :

 private void print_button_Click(object sender, RoutedEventArgs e) { PrintDG print = new PrintDG(); print.printDG(datagridName, "Title"); } 

如果在执行期间发生任何错误,请告诉我我将解决它。这是运行代码,只需要复制和过去。
编辑:
我将row声明为动态。动态关键字决定运行时。属于哪种类型的数据。无论是DataTable还是其他。