我有一个wpf应用程序,我在其中使用infragistics 14.2的xamdatagrid来显示数据。 有时网格可能包含1000多条记录。在同一个应用程序中我给出了打印选项来打印网格数据。打印时我使用的是Infragistics的Report对象。但是在打印之前我使用xamprintpreview控件生成打印数据的预览。
当网格包含大量数据(1000条记录)时,需要35秒才能生成1000条记录的预览。
我将Datatable绑定到xamdatagrid(所以你可以说每条记录都是一种DataRow)。
为了加快预览过程,我有一个想法,只能在预览中显示网格的前n条记录。但是我无法获取网格的前n条记录并将它们存储在数据表中,因为如果我从数据表中获取10条记录我已绑定到网格,用户已在网格上应用了一些过滤器,因此我的预览与实际网格不匹配。
所以请帮我从当前显示的网格中获取tp 10记录并将其存储 数据表。
提前致谢...
答案 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;
}
}
}