2015-09-28 73 views
1

我需要編輯顯示在我的數據透視表中的信息,但組件不讓我這樣做。我將數據透視表綁定到一個使用Npgsql從數據庫(PostgreSQL)填充的DataTable對象。 這是填充行了DataSource爲什麼我無法編輯DevExpress數據透視表數據?

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 }); 

的事情是,我得到的數據透視表,因爲我想,但我不能不要編輯網格中的數據。

enter image description here

我使用的DevExpress 13.2版本,有點老了,也許我需要更新,也許我需要配置在組件的東西。任何想法?

+0

DevExpress對數據透視表沒有太多支持。您可以爲數據透視表做的唯一事情就是設置數據源。然後DevExpress數據透視表將在之後重新計算一切。如果我沒有記錯,數據透視表的數據源甚至不是一個dependencyProperty。我可以想象即使改變一個單元格也需要再次刷新誰的DataSource。 – cscmh99

+0

嗨@ cscmh99,事情是,在文件中說,你可以簡單地編輯任何單元格,我試圖,我不能編輯,但也許是指一個較新的版本?請檢查[此處](https://documentation.devexpress.com/#InterfaceElementsWin/CustomDocument8457) – Aramillo

+2

數據透視表中的單元格是數據的聚合,例如訂單總和。更新值無意義,因爲您無法在聚合數據上傳播更新。使用gridview更新基礎表 – HubertL

回答

2

默認情況下,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支持中心主題。

+0

謝謝你,你明確地解決了我的問題。鏈接也有很好的樣本。 – Aramillo