【问题标题】:Why can't I edit DevExpress pivot table data?为什么我不能编辑 DevExpress 数据透视表数据?
【发布时间】:2015-09-28 16:59:09
【问题描述】:

我需要编辑数据透视表中显示的信息,但组件不允许我这样做。我将数据透视表绑定到 DataTable 对象,该对象使用 Npgsql 从数据库 (PostgreSQL) 填充。 这是填充DataSource 的行:

PivotGridControl1.DataSource = connection.getDataFromQuery("select * from fact");

方法getDataFromQuery 返回一个带有查询执行结果的DataTable。 然后我定义我的数据透视表的区域:

PivotGridField rowName = new PivotGridField ("item", FieldArea.RowArea);
PivotGridField columnField = new PivotGridField("name", FieldArea.ColumnArea);
PivotGridField dataField = new PivotGridField("amount", FieldArea.DataArea);

最后将它们添加到控件中:

PivotGridControl1.Fields.AddRange(new[] { rowName, columnField, dataField });

问题是我得到了我想要的数据透视表,但我无法编辑网格内的数据。

我用的是DevExpress 13.2版本,有点旧,可能需要更新,或者可能需要在组件中配置一些东西。有什么想法吗?

【问题讨论】:

  • DevExpress 对数据透视表的支持不多。您可以为数据透视表做的几乎唯一的事情就是设置数据源。然后 DevExpress PivotTable 将在之后重新计算所有内容。如果我没记错的话,数据透视表的数据源甚至不是依赖属性。我可以想象即使更改一个单元格也需要再次刷新 who DataSource。
  • 嗨@cscmh99,问题是文档中说您可以简单地编辑任何单元格,我正在尝试,但我无法编辑,但可能是指较新的版本?请查看here
  • 数据透视表中的单元格是数据的聚合,例如订单总和。更新值没有任何意义,因为您无法在聚合数据上传播更新。使用 gridview 更新基础表
  • @HubertL 这是一个很好的观点。但是为什么文档说this 是可能的?我现在很困惑
  • 你说得对,这很令人困惑......也许如果聚合运算符是 max 或 min 或者如果没有聚合。你可以发一张票,我一直发现 DevExpress 支持非常及时地回复

标签: c# wpf postgresql devexpress pivot-table


【解决方案1】:

默认情况下PivotGridControl 中的数据无法编辑,但您可以通过更改PivotGridField.CellTemplate 属性或PivotGridControl.FieldCellTemplate 属性来指定单元格的编辑器。
例如:

<dxpg:PivotGridControl.FieldCellTemplate>
    <DataTemplate>
        <dxe:PopupCalcEdit
            EditValue="{Binding Value, Mode=OneWay}"
            ...
        />
    </DataTemplate>
</dxpg:PivotGridControl.FieldCellTemplate>

但您必须考虑,在您的编辑器中编辑的值将如何反映在您的基础数据源中,因为 PivotGridControl 中的值是聚合,而不是数据本身。
示例如下:

<dxpg:PivotGridControl.FieldCellTemplate>
    <DataTemplate>
        <dxe:PopupCalcEdit
            EditMode="InplaceInactive"
            EditValue="{Binding Value, Mode=OneWay}"
            MouseDown="PopupCalcEdit_MouseDown"
            LostFocus="PopupCalcEdit_LostFocus"
        />
    </DataTemplate>
</dxpg:PivotGridControl.FieldCellTemplate>

private void PopupCalcEdit_MouseDown(object sender, MouseButtonEventArgs e)
{
    var calcEdit = sender as PopupCalcEdit;

    if (calcEdit == null)
        return;

    calcEdit.EditMode = EditMode.InplaceActive;
}

private void PopupCalcEdit_LostFocus(object sender, RoutedEventArgs e)
{
    var calcEdit = sender as PopupCalcEdit;

    if (calcEdit == null && calcEdit.EditMode != EditMode.InplaceActive)
        return;

    var cellsArea = calcEdit.DataContext as CellsAreaItem;

    if (cellsArea == null)
        return;

    var dataTable = (DataTable)PivotGridControl.DataSource;

    var drillSource = PivotGridControl.CreateDrillDownDataSource(cellsArea.ColumnIndex, cellsArea.RowIndex);

    if (drillSource.RowCount > 0)
    {
        int id = (int)drillSource.GetValue(0, "ID"); //Change only the first row in drilled rows.

        dataTable.Rows.Find(id)["amount"] = calcEdit.EditValue;
    }
    else
    {
        var cellInfo = PivotGridControl.GetCellInfo(cellsArea.ColumnIndex, cellsArea.RowIndex);

        object itemValue = cellInfo.GetFieldValue(PivotGridControl.Fields["item"]);
        object nameValue = cellInfo.GetFieldValue(PivotGridControl.Fields["name"]);

        var row = dataTable.NewRow();
        row["item"] = itemValue;
        row["name"] = nameValue;
        row["amount"] = calcEdit.EditValue;

        dataTable.Rows.Add(row);
    }

    calcEdit.EditMode = EditMode.InplaceInactive;

    PivotGridControl.ReloadData();
}

另外,请查看this DevExpress 支持中心线程。

【讨论】:

  • 谢谢你,你绝对解决了我的问题。该链接也有一个非常好的示例。
猜你喜欢
  • 1970-01-01
  • 2021-09-24
  • 2014-06-06
  • 2017-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-02
相关资源
最近更新 更多