【问题标题】:UWP Printing Long Datagrid that need to extend to multiple pagesUWP 打印需要扩展到多页的长数据网格
【发布时间】:2019-05-25 13:18:41
【问题描述】:

我正在使用(uwp、c#、MySQL)制作一个会计程序,如果数据网格很长,我想知道在打印报告时如何将其余部分扩展到新页面,以便将所有报告打印在多个页面上。

我使用了打印示例中的 printhelp.cs:https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/Printing,但它只在一页上打印了数据网格,并没有将其余部分扩展到更多页面。

UWP XAML:

<Grid>
    <controls:DataGrid Grid.Row="2" Grid.RowSpan="5" Grid.ColumnSpan="2"
        x:Name="TextContent"
        Foreground="Black"
        Background="White"
        ItemsSource="{x:Bind SelectSOA()}"
        AutoGenerateColumns="False"    
        GridLinesVisibility="Horizontal">



        <controls:DataGrid.Columns>
            <controls:DataGridTextColumn   Header="ID" Binding="{Binding ID}" />
            <controls:DataGridTextColumn Header="Account" Binding="{Binding Principal}" />
            <controls:DataGridTextColumn Header="Balance" Binding="{Binding Client}" />
        </controls:DataGrid.Columns>

    <RichTextBlockOverflow  x:Name="FirstLinkedContainer" OverflowContentTarget="{Binding ElementName=ContinuationPageLinkedContainer}" Grid.Row="2" Grid.Column="0"/>
    <RichTextBlockOverflow x:Name="ContinuationPageLinkedContainer" Grid.Row="3" Grid.ColumnSpan="2"/>


</Grid>

如果 Datagrid 很长以扩展到下一页,我希望在打印时。但它只打印第一页,不会将其余部分扩展到新页面。

【问题讨论】:

    标签: c# xaml uwp


    【解决方案1】:

    您可以使用 Print Helper 类来打印 DataGrid,但您仍然需要在代码隐藏中手动分页数据。

    请参阅Windows Community Toolkit PrintHelper sample 了解如何使用此类打印 XAML 控件。

    根据该示例,我做了一些小改动,制作了一个简单的代码示例供您参考:

    <Grid>
        <Grid x:Name="RootGrid"
              HorizontalAlignment="Center"
              VerticalAlignment="Center">
            <Grid.RowDefinitions>
                <RowDefinition Height="*" />
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>
            <Grid x:Name="Container"
                  Grid.RowSpan="2"
                  Opacity="0" />
            <Grid x:Name="CustomPrintContainer"
                  Opacity="0" />
            <Grid x:Name="DirectPrintContainer">
                <Grid x:Name="PrintableContent">
                    <Grid x:Name="XamlRoot" />
                </Grid>
            </Grid>
        </Grid>
        <Button Content="Print" Click="Button_Click" VerticalAlignment="Bottom"></Button>
    </Grid>
    
    public List<Person> Persons { get; set; }
    
        public MainPage()
        {
            this.InitializeComponent();
    
            Persons = new List<Person>();
            for (int i = 0; i < 100; i++)
            {
                Persons.Add(new Person
                {
                    PersonId = i,
                    FirstName = "FirstName" + i,
                    LastName = "LastName" + i,
                    Position = "Network Administrator " + i
                });
            }
        }
    
        private PrintHelper _printHelper;
    
        private async void Button_Click(object sender, RoutedEventArgs e)
        {
            _printHelper = new PrintHelper(CustomPrintContainer);
    
            var pageNumber = 0;
    
            for (int i = 0; i < Persons.Count; i = i + 10)
            {
                var grid = new Grid();
                grid.RowDefinitions.Add(new RowDefinition() { Height = GridLength.Auto });
                grid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1, GridUnitType.Star) });
                grid.RowDefinitions.Add(new RowDefinition() { Height = GridLength.Auto });
    
                // Static header
                var header = new TextBlock { Text = "Custom Print", Margin = new Thickness(0, 0, 0, 20) };
                Grid.SetRow(header, 0);
                grid.Children.Add(header);
    
                // Main content with layout from data template
                var dataGrid = new DataGrid();
                dataGrid.AutoGenerateColumns = true;
                dataGrid.ItemsSource = Persons.Skip(i).Take(10);
                Grid.SetRow(dataGrid, 1);
                grid.Children.Add(dataGrid);
    
                // Footer with page number
                pageNumber++;
                var footer = new TextBlock { Text = string.Format("page {0}", pageNumber), Margin = new Thickness(0, 20, 0, 0) };
                Grid.SetRow(footer, 2);
                grid.Children.Add(footer);
    
                _printHelper.AddFrameworkElementToPrint(grid);
            }
    
            _printHelper.OnPrintCanceled += _printHelper_OnPrintCanceled;
            _printHelper.OnPrintFailed += _printHelper_OnPrintFailed;
            _printHelper.OnPrintSucceeded += _printHelper_OnPrintSucceeded;
    
            var printHelperOptions = new PrintHelperOptions(false);
            printHelperOptions.Orientation = Windows.Graphics.Printing.PrintOrientation.Default;
            printHelperOptions.AddDisplayOption(StandardPrintTaskOptions.Orientation);
            await _printHelper.ShowPrintUIAsync("print sample", printHelperOptions);
        }
    
    public class Person
    {
        public int PersonId { get; set; }
        public int DepartmentId { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Position { get; set; }
    }
    

    【讨论】:

    • 非常感谢 Xavier 先生,您的回答非常完美,非常感谢,因为它解决了在我的程序中打印报告的一个大问题。
    • 我在您建议的示例中执行了您的代码,并且数据网格可以打印在多个页面上,我不知道如何感谢您,这是我从您的代码中执行的示例,非常感谢您所有的帮助和支持:1drv.ms/f/s!AlMee_hcZcWpjXQC4E_0suWZPuqh
    猜你喜欢
    • 2015-05-07
    • 1970-01-01
    • 2016-12-25
    • 2019-03-23
    • 2022-06-13
    • 2016-08-22
    • 2016-05-22
    • 2014-05-07
    • 2015-09-14
    相关资源
    最近更新 更多