繁体   English   中英

我可以在运行时在DevExpress的PivotGrid中对DateTime类型的数据进行分组吗?

[英]Can I group DateTime type data in PivotGrid of DevExpress during runtime?

我在WPF中有一个PivotGrid(DevExpress),并将数据源绑定到一个IList,该IList包含对象,该对象具有几种DateTime类型的属性。 我希望最终用户在运行时选择用户要按年,月或日分组的那些DateTime字段。 那可能吗?

我知道我可以通过编程方式提供DateTime分组,但是由于有多个DateTime字段,因此如果最终用户可以选择要对哪个DateTime字段进行分组以及如何在运行时对其进行分组,这将非常繁琐且不必要。

你能指导我怎么做吗?

我有以下几点:

  <dxdo:LayoutControlItem ItemWidth="1*">
                                <dxpg:PivotGridControl MaxHeight="800" MaxWidth="800" DataSource="{Binding AllChildOrders}" DataSourceChanged="PivotGridControl_OnDataSourceChanged">
                            </dxpg:PivotGridControl>
                        </dxdo:LayoutControlItem>

并在后面的代码中:

private void PivotGridControl_OnDataSourceChanged(object sender, RoutedEventArgs e)
    {
        var pivotTable = sender as PivotGridControl;
        pivotTable.RetrieveFields();
    }

上面的代码有效,并且数据透视表将在运行时显示所有可用字段,包括DateTime类型的字段。 我不想以编程方式指定要以特定方式进行分组的字段,而是让最终用户在运行时选择如何以及将哪些字段进行分组。 可能?

另外,我可以想象以编程方式创建子分组,如下所示:如何完成以下任务?

在此处输入图片说明

0.预先生成的组

如果不想以编程方式指定要分组的字段,则可以为每个DateTime字段预生成组,以便用户可以在字段本身和字段组之间进行选择。
这是示例:

private void PivotGridControl_DataSourceChanged(object sender, RoutedEventArgs e)
{
    var pivotTable = sender as PivotGridControl;
    pivotTable.Groups.Clear();
    pivotTable.RetrieveFields();

    var dateTimeFields = pivotTable.Fields.Where(item => item.DataType == typeof(DateTime)).ToList();

    foreach (var field in dateTimeFields)
    {
        var group = new PivotGridGroup();
        group.Add(new PivotGridField() { FieldName = field.FieldName, Caption = field.Caption + " (year)", GroupInterval = FieldGroupInterval.DateYear });
        group.Add(new PivotGridField() { FieldName = field.FieldName, Caption = field.Caption + " (month)", GroupInterval = FieldGroupInterval.DateMonth });
        group.Add(new PivotGridField() { FieldName = field.FieldName, Caption = field.Caption + " (day)", GroupInterval = FieldGroupInterval.DateDay });

        foreach (var groupField in group)
            pivotTable.Fields.Add(groupField);

        pivotTable.Groups.Add(group);
    }
}

这是示例的屏幕截图:
屏幕截图

1.创建子分组

您可以通过使用PivotGridField.DisplayFolder属性来创建子分组。
这是示例:

private void PivotGridControl_DataSourceChanged(object sender, RoutedEventArgs e)
{
    var pivotTable = sender as PivotGridControl;
    pivotTable.RetrieveFields();

    var dateTimeFields = pivotTable.Fields.Where(item => item.DataType == typeof(DateTime)).ToList();

    foreach (var field in dateTimeFields)
    {
        var fieldYear = new PivotGridField()
        {
            FieldName = field.FieldName,
            Caption = field.Caption + " (year)",
            GroupInterval = FieldGroupInterval.DateYear,
            Visible = false,
            DisplayFolder = field.Caption
        };

        var fieldMonth = new PivotGridField()
        {
            FieldName = field.FieldName,
            Caption = field.Caption + " (month)",
            GroupInterval = FieldGroupInterval.DateMonth,
            Visible = false,
            DisplayFolder = field.Caption
        };

        var fieldDay = new PivotGridField()
        {
            FieldName = field.FieldName,
            Caption = field.Caption + " (day)",
            GroupInterval = FieldGroupInterval.DateDay,
            Visible = false,
            DisplayFolder = field.Caption
        };

        pivotTable.Fields.Add(fieldYear);
        pivotTable.Fields.Add(fieldMonth);
        pivotTable.Fields.Add(fieldDay);
    }
}

结果如下:
结果

2.自定义弹出菜单

您可以将命令添加到字段弹出菜单,该菜单允许用户更改组间隔。 为此,您可以使用PivotGridControl.PopupMenuShowing事件和PopupMenuShowingEventArgs.Customizations属性来自定义菜单。
这是示例:

private void PivotGridControl_DataSourceChanged(object sender, RoutedEventArgs e)
{
    var pivotTable = sender as PivotGridControl;
    pivotTable.Groups.Clear();
    pivotTable.RetrieveFields();
}

private void PivotGridControl_PopupMenuShowing(object sender, PopupMenuShowingEventArgs e)
{
    if (e.MenuType != PivotGridMenuType.Header)
        return;

    var fieldHeader = e.TargetElement as FieldHeader;

    if (fieldHeader == null)
        return;

    var field = fieldHeader.Content as PivotGridField;

    if (field == null || (field.Group != null && field.Group.IndexOf(field) > 0))
        return;

    var groupInterval = field.GroupInterval;

    if (groupInterval == FieldGroupInterval.Default && field.DataType != typeof(DateTime))
        return;

    var dateTimeIntervals = new List<FieldGroupInterval>(new FieldGroupInterval[]
    {
        FieldGroupInterval.DateYear,
        FieldGroupInterval.DateQuarter,
        FieldGroupInterval.DateMonth,
        FieldGroupInterval.DateDay,
        FieldGroupInterval.Hour,
        FieldGroupInterval.Minute,
        FieldGroupInterval.Second,
        FieldGroupInterval.DateWeekOfYear,
        FieldGroupInterval.DateWeekOfMonth,
        FieldGroupInterval.DateDayOfYear,
        FieldGroupInterval.DateDayOfWeek,
        FieldGroupInterval.Date,
        FieldGroupInterval.Default
    });

    if (!dateTimeIntervals.Contains(groupInterval))
        return;

    var pivotTable = sender as PivotGridControl;

    var subMenu = new BarSubItem() { };
    subMenu.Content = "Set group interval";

    if (field.Group == null)
    {
        var button = new BarButtonItem() { Content = "Year - Month - Date" };
        button.ItemClick += (s, eventArgs) =>
        {
            pivotTable.BeginUpdate();

            var group = field.Tag as PivotGridGroup;

            if (group == null)
            {
                if (groupInterval != FieldGroupInterval.Default)
                    field.Caption = field.Caption.Replace(" (" + groupInterval + ")", string.Empty);

                group = new PivotGridGroup();
                group.Add(new PivotGridField() { FieldName = field.FieldName, Caption = field.Caption + " (year)", GroupInterval = FieldGroupInterval.DateYear, Tag = field, Area = field.Area, AreaIndex = field.AreaIndex });
                group.Add(new PivotGridField() { FieldName = field.FieldName, Caption = field.Caption + " (month)", GroupInterval = FieldGroupInterval.DateMonth });
                group.Add(new PivotGridField() { FieldName = field.FieldName, Caption = field.Caption + " (day)", GroupInterval = FieldGroupInterval.DateDay });

                foreach (var groupField in group)
                    pivotTable.Fields.Add(groupField);

                pivotTable.Groups.Add(group);

                group.Tag = field;
            }
            else
            {
                var yearField = group[0];

                yearField.Area = field.Area;
                yearField.AreaIndex = field.AreaIndex;
                yearField.ShowInCustomizationForm = true;
            }

            field.Visible = false;
            field.ShowInCustomizationForm = false;

            pivotTable.EndUpdate();
        };

        subMenu.Items.Add(button);
    }

    foreach (var dateTimeInterval in dateTimeIntervals.Where(item => item != groupInterval))
    {
        var button = new BarButtonItem() { Content = dateTimeInterval, Tag = field };
        subMenu.Items.Add(button);

        button.ItemClick += (s, eventArgs) =>
        {
            pivotTable.BeginUpdate();

            var group = field.Group;

            if (group != null)
            {
                var yearField = field;
                field = yearField.Tag as PivotGridField;

                field.Area = yearField.Area;
                field.AreaIndex = yearField.AreaIndex;
                field.ShowInCustomizationForm = true;

                yearField.Visible = false;
                yearField.ShowInCustomizationForm = false;
            }
            else if (groupInterval != FieldGroupInterval.Default)
                field.Caption = field.Caption.Replace(" (" + groupInterval + ")", string.Empty);

            field.GroupInterval = dateTimeInterval;

            if (dateTimeInterval != FieldGroupInterval.Default)
                field.Caption += " (" + dateTimeInterval + ")";

            pivotTable.EndUpdate();
        };
    }

    e.Customizations.Add(subMenu);
}

结果如下:
结果与子菜单

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM