首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >wpf中的不碎片X-数据农业中的Top n记录

wpf中的不碎片X-数据农业中的Top n记录
EN

Stack Overflow用户
提问于 2015-01-25 08:04:54
回答 2查看 1.2K关注 0票数 1

我有一个wpf应用程序,在这个应用程序中,我使用xamdatagidofInFrameical14.2来显示数据。有时网格可能包含超过1000 record.In的应用程序,我给出了打印选项来打印网格data.for打印,我在打印之前使用Infragistics.but的Report对象生成打印数据的预览,使用xamprint预览控件。

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

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

为了加速预览过程,我想在preview.but中只显示网格的顶部n条记录,我无法获取网格的顶部n条记录并将它们存储在datatable中,因为如果我从datatable获取10条我绑定到网格的记录,用户在网格上应用了一些过滤器,所以我的预览与实际网格不匹配。

因此,请帮助我从当前显示的网格中获取tp 10记录,并将它们存储在datatable中。

提前谢谢..。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-01 11:45:14

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

xamDataGrid.RecordManager.GetFilteredInDataRecords()给出过滤后的记录。如果你没有任何过滤器,它会给你所有的记录。那么拿(10)就会花10倍。我将ToDataTable作为扩展方法来实现,以将获取的记录转换为datatable。

代码语言:javascript
运行
复制
<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;
        }
    }
}
票数 1
EN

Stack Overflow用户

发布于 2016-08-30 18:50:20

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

代码语言:javascript
运行
复制
 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作为命令参数发送到视图模型中的命令,然后循环遍历数据记录,将它们添加到数据表中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28134441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档