如何在 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
、实例化 FlowDocument
和 Paragraph
对象附加字符串。
将从 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...");
"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
、实例化 FlowDocument
和 Paragraph
对象附加字符串。
将从 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...");