如何在 WPF 中打印 DataGrid,而不是 DataGridView

How to print a DataGrid in WPF, not a DataGridView

"InvokePaint" 显示错误,InvokePaint 方法的 "this" 应该是 class,但我不知道应该是哪个 class,我们将不胜感激。

SqlDataAdapter da = new SqlDataAdapter("Select * from CallRegister", data.getCon());
                DataTable dt = new DataTable("Call Reciept");
                da.Fill(dt);
                DataGrid dg = new DataGrid();
                dg.ItemsSource = dt.DefaultView;
                System.Drawing.Size m = new System.Drawing.Size((int)dg.Width, (int)dg.Height);

                System.Windows.Forms.PaintEventArgs myPaintArgs = new System.Windows.Forms.PaintEventArgs(e.Graphics, new System.Drawing.Rectangle(new System.Drawing.Point(0, 0),m));
                this.InvokePaint(dg, myPaintArgs);

此方法只能从 WindowsForms 控件调用 as MSDN says:

Raises the Paint event for the specified control. Namespace:
System.Windows.Forms Assembly: System.Windows.Forms (in System.Windows.Forms.dll)

因此应该从 WPF 项目中的托管 WinForms 控件调用此代码:

this.InvokePaint((dg, myPaintArgs); 

更新。打印数据网格:

XAML:

<DataGrid  ItemsSource="{Binding Path=Persons, Mode=TwoWay}" Name="dataGrid"/>
<Button Grid.Row="1" Click="Button_Click" Content="Print DataGrid"/>

后面的代码:

private void Button_Click(object sender, RoutedEventArgs e)
{            
   var pd = new PrintDialog();
   var result = pd.ShowDialog();
   if (result.HasValue && result.Value)
      pd.PrintVisual(dataGrid, "My WPF printing a DataGrid");
}
 PrintDialog printDialog = new PrintDialog();
 printDialog.PrintVisual(dataGrid, "Print Grid");

遍历每个项目的 DataGrid。使用 StringBuilder、实例化 FlowDocumentParagraph 对象附加字符串。

将从 StringBuilder 创建的字符串添加到 Paragraph,并将 Paragraph 添加到 FlowDocument。使用 PrintDialog 打印 FlowDocument(转换为 IDocumentPaginatorSource

StringBuilder sbClipboardStringText = new StringBuilder();
foreach (object dataItem in dgvDataGridView.Items)
{
    var drvDataRowView = dataItem as DataRowView;

    string var2 = (string)drvDataRowView["Var2"];
    int var3 = (int)drvDataRowView["Var3"];

    sbClipboardStringText.AppendFormat("{0} \t {1}\n", var2.Trim(), var3);
}
string result = sbClipboardStringText.ToString();

Paragraph p = new Paragraph();
p.Margin = new Thickness(50);

p.Inlines.Add(result);
flowDocument.Blocks.Add(p);

PrintDialog pd = new PrintDialog();
if (pd.ShowDialog() != true) return;

flowDocument.PageHeight = pd.PrintableAreaHeight;
flowDocument.PageWidth = pd.PrintableAreaWidth;

IDocumentPaginatorSource idocument = flowDocument as IDocumentPaginatorSource;

pd.PrintDocument(idocument.DocumentPaginator, "Printing Flow Document...");