来自wpf中infragistics xamdatagrid的前n条记录

时间:2015-01-25 08:04:55

标签: infragistics xamdatagrid

我有一个wpf应用程序,我在其中使用infragistics 14.2的xamdatagrid来显示数据。 有时网格可能包含1000多条记录。在同一个应用程序中我给出了打印选项来打印网格数据。打印时我使用的是Infragistics的Report对象。但是在打印之前我使用xamprintpreview控件生成打印数据的预览。

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

我将Datatable绑定到xamdatagrid(所以你可以说每条记录都是一种DataRow)。

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

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

提前致谢...

2 个答案:

答案 0 :(得分:1)

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

(function (Twifty) {
    // Add objects to the Twifty namespace
    return Twifty;
}(Twifty || {}));

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

答案 1 :(得分:1)

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

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

<Window x:Class="Stackoverflow1.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:Stackoverflow1"
        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 Stackoverflow1
{
    /// <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;
        }
    }
}