C# DevExpress如何获取父GridView列以显示子GridView的总和';s柱

C# DevExpress如何获取父GridView列以显示子GridView的总和';s柱,c#,gridview,devexpress,C#,Gridview,Devexpress,我有一个模型,里面有一个模型列表(简化): gridInventory是DevXpress GridControl 我已经从gridview实现了这些方法: private void gridView1_MasterRowGetChildList(object sender, DevExpress.XtraGrid.Views.Grid.MasterRowGetChildListEventArgs e) { GridItemModel i = (GridItemModel

我有一个模型,里面有一个模型列表(简化):

gridInventory
是DevXpress GridControl

我已经从gridview实现了这些方法:

    private void gridView1_MasterRowGetChildList(object sender, DevExpress.XtraGrid.Views.Grid.MasterRowGetChildListEventArgs e) {
        GridItemModel i = (GridItemModel)gridView1.GetRow(e.RowHandle);
        e.ChildList = new BindingSource(i, "Inventory");
    }

    private void gridView1_MasterRowGetRelationName(object sender, DevExpress.XtraGrid.Views.Grid.MasterRowGetRelationNameEventArgs e) {
        e.RelationName = "Inventory";
    }

    private void gridView1_MasterRowGetRelationCount(object sender, DevExpress.XtraGrid.Views.Grid.MasterRowGetRelationCountEventArgs e) {
        e.RelationCount = 1;
    }

    private void gridView1_MasterRowEmpty(object sender, DevExpress.XtraGrid.Views.Grid.MasterRowEmptyEventArgs e) {
        GridItemModel i = (GridItemModel)gridView1.GetRow(e.RowHandle);
        e.IsEmpty = i == null;
    }
这使我的网格看起来像这样:

当使用各种过滤器时,子视图中的某些项是隐藏的,我需要结束列上的数量来反映仅可见子记录的总和

到目前为止,我已经覆盖了
gridView1\u CustomUnboundColumnData
,如下所述: 但我没有数据行,它们只能转换为GridItemModel

我可以访问网格中的项目:

GridView view = sender as GridView;
if (e.Column.FieldName != "colCalcQty") return;
if (!e.IsGetData) return;
var list = (view.DataSource as IList);

var item = (list[e.ListSourceRowIndex] as GridItemModel);
但是item.Inventory始终显示所有库存模型,而不是过滤器未删除的模型

我可以分别通过gridView1和gridView2访问父网格和子网格

如何使用现有设置从“可见子视图数量”字段创建汇总列

编辑: 我用两种不同的方式过滤我的视图,首先我在我的网格上启用了ShowAutoFilterRow,但这只过滤父记录

然后,我在表单的其他地方有一个组合框,它在所选索引更改事件上调用以下代码:

        InventoryLibrary.DataTransferObjects.SimpleLocationModel location = ((ComboBoxEdit)cbeLocationsFilter).SelectedItem as InventoryLibrary.DataTransferObjects.SimpleLocationModel;
        InventoryLibrary.DataTransferObjects.SimpleLocationModel subLocation = ((ComboBoxEdit)cbeSubLocationsFilter).SelectedItem as InventoryLibrary.DataTransferObjects.SimpleLocationModel;

        string itemFilterString = "";
        string locationFilterString = "";


        if (location != null) {
            itemFilterString += String.Format("[LocationNames] LIKE '%{0}%'", location.Name);
            locationFilterString += String.Format("[LocationAndSublocation] LIKE '%{0}%'", location.Name);
        }

        if (subLocation != null) {

            if (location != null) itemFilterString += " AND ";
            itemFilterString += String.Format("[LocationNames] LIKE '%{0}%'", subLocation.Name);

            if (location != null) locationFilterString += " AND ";
            locationFilterString += String.Format("[LocationAndSublocation] LIKE '%{0}%'", subLocation.Name);
        }

        gridView1.ActiveFilterString = itemFilterString;
        gridView2.ActiveFilterString = locationFilterString;

这就是当
gridView2.ActiveFilterString
应用了筛选字符串时筛选详细视图的内容。

您需要获取当前行的
DetailView
以及所有
DetailView
筛选行的总数。若要获取
DetailView
可以使用方法,若要获取筛选行,可以使用undocumented
GridView.DataController.GetAllFilteredSortedRows
方法。如果
DetailView
为空,则需要获取«DevExpress筛选引擎»,并将其与
GridItemModel.Inventory
列表一起使用。您可以从
DevExpress
控件获取此引擎,例如:

  • 网格控制
  • 数据透视网格控件
  • 过滤控制
  • e、 t.c
以下是
gridView1\u CustomUnboundColumnData
事件和
GridControl
作为«DevExpress过滤引擎»的示例。对于本例,您需要添加额外的
GridControl
0,并向该控件添加
GridView
1

if (!e.IsGetData || e.Column.FieldName != "colCalcQty")
    return;

var rowHandle = gridView1.GetRowHandle(e.ListSourceRowIndex);
var view = gridView1.GetDetailView(rowHandle, 0);

int quantity = 0;

if (view == null)
{
    var gridItem = (GridItemModel)e.Row;

    gridControl2.DataSource = gridItem.Inventory;
    gridControl2.RefreshDataSource();
    gridView3.ActiveFilterString = gridView2.ActiveFilterString;

    view = gridView3;
}

foreach (var row in view.DataController.GetAllFilteredAndSortedRows())
{
    var gridItemInventory = (GridItemInventoryModel)row;
    quantity += gridItemInventory.Quantity;
}

e.Value = quantity;
此外,在将过滤器设置为
DetailView
后,您还需要刷新
main视图:

gridView2.ActiveFilterString = "Some filter criteria";
gridView1.RefreshData();

示例中的0-
gridControl2


1-
gridView3
在示例中。

这非常接近,数量列最初是正确的(例如100)。然后,我过滤我的结果,然后数量列是错误的(仍然是100),如果我展开详细视图,数量列将更新为正确的数字(例如50)。您知道如何在不展开详细记录的情况下获取要更新的数量吗?@Smithy在展开之前如何过滤您的详细视图?我编辑了我的答案,以显示详细情况,但基本上我称之为:gridView2.ActiveFilterString=locationFilterString@Smithy您需要使用«DevExpress过滤器引擎»将过滤器应用于
GridItemModel.Inventory
列表。请看我的最新版本。@Smithy是的,它仅用于在后台计数数量。例如,我使用了
GridControl
。您也可以尝试使用
PivotGridControl
FilterControl
if (!e.IsGetData || e.Column.FieldName != "colCalcQty")
    return;

var rowHandle = gridView1.GetRowHandle(e.ListSourceRowIndex);
var view = gridView1.GetDetailView(rowHandle, 0);

int quantity = 0;

if (view == null)
{
    var gridItem = (GridItemModel)e.Row;

    gridControl2.DataSource = gridItem.Inventory;
    gridControl2.RefreshDataSource();
    gridView3.ActiveFilterString = gridView2.ActiveFilterString;

    view = gridView3;
}

foreach (var row in view.DataController.GetAllFilteredAndSortedRows())
{
    var gridItemInventory = (GridItemInventoryModel)row;
    quantity += gridItemInventory.Quantity;
}

e.Value = quantity;
gridView2.ActiveFilterString = "Some filter criteria";
gridView1.RefreshData();