WPF print Datagrid table

Here, it is mainly printed in a similar image format, and a simple DataGrid table can be printed. Methods as below:

Add the table to the canvas, and then call the printer to print the canvas directly. The specific code is as follows:

Use a separate window to put the canvas and pass the table in. Because my data is the data on the bound DataTable, I add a header to it and bind it (to put it bluntly, change the header).

xmal:

<Window x:Class="MyControlLibrarys.PrintDataWind"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="打印窗口" Height="600" Width="850">
    <Grid>
        <Canvas x:Name="printArea">
            <DataGrid Name="dgData" AutoGenerateColumns="False" CanUserAddRows="False" GridLinesVisibility="All" Margin="20">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="序号" Width="70" Binding="{Binding Path=id, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn>
                    <DataGridTextColumn Header="测试步骤" Width="140" Binding="{Binding Path=step, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn>
                    <DataGridTextColumn Header="测试内容" Width="140" Binding="{Binding Path=content, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn>
                    <DataGridTextColumn Header="标准" Width="120" Binding="{Binding Path=standard, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn>
                    <DataGridTextColumn Header="实测" Width="120" Binding="{Binding Path=actual, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn>
                    <DataGridTextColumn Header="结论" Width="120" Binding="{Binding Path=conclusion, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn>
                </DataGrid.Columns>
            </DataGrid>
        </Canvas>
    </Grid>
</Window>

Background code:

/// <summary>
    /// Interactive logic of PrintDataWind.xaml
    /// </summary>
    public partial class PrintDataWind : Window
    {
        public PrintDataWind(System.Data.DataTable dt)
        {
            InitializeComponent();
            this.dgData.ItemsSource = dt.DefaultView;
        }

        public void print()
        {
            PrintDialog dialog = new PrintDialog();
            if (dialog.ShowDialog() == true)
            {
                dialog.PrintVisual(printArea, "Print Data");
            }
        }
    }

calling code:

Part of xmal (for consistency):

<DataGrid Grid.Row="1"  ColumnHeaderStyle ="{DynamicResource DataGridColumnHeaderStyle}" Grid.Column="0" Name="dgData" AutoGenerateColumns="False" CanUserAddRows="False" GridLinesVisibility="All">
            <DataGrid.Columns>
                <DataGridTextColumn Width="0.8*" Header="序号" ElementStyle="{StaticResource contentCenterStyle}" Binding="{Binding Path=OrderId, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn>
                <!--DataGridTextColumn Header="序号" Width="*" Binding="{Binding Path=id, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"></-->
                <DataGridTextColumn Header="测试步骤" Width="2*" Binding="{Binding Path=step, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn>
                <DataGridTextColumn Header="测试内容" Width="2*" Binding="{Binding Path=content, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn>
                <DataGridTextColumn Header="标准" Width="2*" Binding="{Binding Path=standard, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn>
                <DataGridTextColumn Header="实测" Width="2*" Binding="{Binding Path=actual, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn>
                <!--DataGridTextColumn Header="结论" Width="2*" Binding="{Binding Path=conclusion, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" Foreground="{Binding Path=conclusion,ConverterParameter=通过, Converter={StaticResource DataColorConverterStyle}}"></-->
                <DataGridTemplateColumn Width="2*" Header="结论">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Path=conclusion,Mode=OneWay,UpdateSourceTrigger=PropertyChanged}"
                                       Foreground="{Binding Path=conclusion,Converter={StaticResource DataColorConverterStyle}}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>

Background calling code:

/// <summary>
        /// print data
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void PrintData_Click(object sender, RoutedEventArgs e)
        {
            PrintDataWind pdw = new PrintDataWind(_dt);
            pdw.print();
        }
In this way, you can print. Although the method is stupid, it works. This method can also print pictures and so on.

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325724559&siteId=291194637