来自 wpf 中的 infragistics xamdatagrid 的 Top n 记录

Top n Record from infragistics xamdatagrid in wpf

我有一个 wpf 应用程序,我在其中使用 infragistics 14.2 的 xamdatagrid 来显示数据。 有时网格可能包含超过 1000 个 record.In 相同的应用程序 我已经给出打印选项来打印网格 data.for 打印 我在打印前使用 Infragistics.but 的报告对象 我正在使用 xamprintpreview 生成打印数据预览控制。

当网格包含大量数据(1000 条记录)时,生成 1000 条记录的预览需要 35 秒。

我正在将 Datatable 绑定到 xamdatagrid(因此您可以说每条记录都是一种 DataRow)。

为了加快预览过程,我想在 preview.but 中只显示网格的前 n 条记录 我无法获取网格的前 n 条记录并将它们存储在数据表中,因为如果我采取我已绑定到网格的数据表中的 10 条记录,并且用户已在网格上应用了一些过滤器,因此我的预览与实际网格不匹配。

所以请帮我从当前显示的网格中获取 tp 10 记录并将它们存储在 数据表。

提前致谢...

在事件处理程序后面的代码中:

 private void Button_ClickEventHandler(object sender, MouseButtonEventArgs e)            
        {
            DataTable table = new DataTable();
            table.Columns.Add("Data1");
            table.Columns.Add("Data2"); //etc... Add all columns necessary
            var records = XamDataGridName.Records.Take(10);
            foreach (var record in records)
            {
                var item = ((DataRecord)record).DataItem as DataType;
                if (item != null)
                {
                    table.Rows.Add(item.Data1, item.Data2);
                }
            }
        }

或者使用 MVVM,您可以将 XamDataGrid.Records 作为命令参数发送到视图模型中的命令,然后遍历数据记录,将它们添加到您的数据中 table.

你在这里有一个完整的工作示例 关键是:

xamDataGrid.RecordManager.GetFilteredInDataRecords() 为您提供过滤后的记录。如果您没有任何过滤器,它会为您提供所有记录。 然后 Take(10) 将取十个。 我将 ToDataTable 实现为扩展方法,以将获取的记录转换为数据表。

<Window x:Class="Whosebug1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:igDP="http://infragistics.com/DataPresenter"
        xmlns:local="clr-namespace:Whosebug1"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <igDP:XamDataGrid x:Name="xamDataGrid" Loaded="XamDataGrid_Loaded">
            <igDP:XamDataGrid.FieldLayoutSettings>
                <igDP:FieldLayoutSettings FilterUIType="LabelIcons"/>
            </igDP:XamDataGrid.FieldLayoutSettings>

            <igDP:XamDataGrid.FieldSettings>
                <igDP:FieldSettings AllowRecordFiltering="True" FilterLabelIconDropDownType="MultiSelectExcelStyle"/>
            </igDP:XamDataGrid.FieldSettings>
            <igDP:XamDataGrid.FieldLayouts>
                <igDP:FieldLayout>
                    <igDP:Field Name="Date"/>
                    <igDP:Field Name="Order"/>
                </igDP:FieldLayout>
            </igDP:XamDataGrid.FieldLayouts>
        </igDP:XamDataGrid>
        <Button x:Name="btnPrintPreview" Content="Print Preview" Height="25" Width="100" Click="btnPrintPreview_Click"/>
    </Grid>
</Window>

using Infragistics.Windows.DataPresenter;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Windows;

namespace Whosebug1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void XamDataGrid_Loaded(object sender, RoutedEventArgs e)
        {
            ObservableCollection<Item> list = new ObservableCollection<Item>();

            for (int i = 0; i < 15; ++i)
            {
                list.Add(new Item { Date = DateTime.Now.AddDays(-i), Order = i});
            }

            xamDataGrid.DataSource = list;
        }

        private void btnPrintPreview_Click(object sender, RoutedEventArgs e)
        {
            IEnumerable<DataRecord> data = xamDataGrid.RecordManager.GetFilteredInDataRecords();
            DataTable dt = data.Take(10).ToDataTable();
            // DO YOUR PRINT PREVIEW
        }
    }

    class Item
    {
        public DateTime Date { get; set; }
        public int Order { get; set; }

    }

    static class Utils
    {
        public static DataTable ToDataTable(this IEnumerable<DataRecord> items)
        {
            if (items.Count() > 0)
            {
                PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(Item));
                DataTable table = new DataTable();

                List<Item> list = new List<Item>();

                foreach (var item in items)
                {
                    list.Add((Item)item.DataItem);
                }

                foreach (PropertyDescriptor prop in properties)
                    table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);

                foreach (Item item in list)
                {
                    DataRow row = table.NewRow();
                    foreach (PropertyDescriptor prop in properties)
                        row[prop.Name] = prop.GetValue(item) ?? DBNull.Value;
                    table.Rows.Add(row);
                }

                return table;
            }

            return null;
        }
    }
}