【问题标题】:DevExpress how to get parent GridView column to show a sum of a child GridView's columnDevExpress 如何获取父 GridView 列以显示子 GridView 列的总和
【发布时间】:2015-01-14 14:03:38
【问题描述】:

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

public class GridItemModel {
    public int ID { get; set; }
    public string Name { get; set; }
    public List<GridItemInventoryModel> Inventory { get; set; }
}

public class GridItemInventoryModel {
    public int Quantity { get; set; }
}

我像这样将我的数据绑定到网格视图(gridItems 是 GridItemModel 的列表):

gridItems = dal.GetInventoryGrid().ToList();

gridInventory.DataSource = gridItems;

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

这让我的网格看起来像这样:

当使用各种过滤器时,子视图中的某些项目被隐藏,我需要最后一列的 Quantity 来反映仅可见子记录的总和。

到目前为止,我已经覆盖了gridView1_CustomUnboundColumnData,如下所述: http://www.wenda.io/questions/5156824/how-to-make-the-sum-of-each-detail-gridview-and-populated-in-the-footer-of-maste.html 但我没有 DataRows,它们只能转换为 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 应用了过滤字符串时,这会过滤详细视图。

【问题讨论】:

    标签: c# gridview devexpress


    【解决方案1】:

    您需要获取当前行的DetailView 以及所有DetailView 过滤行的总数量。要获得DetailView,您可以使用GridView.GetDetailView 方法,要获得过滤的行,您可以使用未记录的GridView.DataController.GetAllFilteredAndSortedRows 方法。如果DetailView 为空,那么您需要获取«DevExpress 过滤引擎» 并将其与您的GridItemModel.Inventory 列表一起使用。您可以从DevExpress 控件中获取此引擎,例如:

    • 网格控制
    • PivotGridControl
    • 过滤控制

    这是gridView1_CustomUnboundColumnData 事件和GridControl 作为«DevExpress 过滤引擎» 的示例。对于此示例,您需要添加额外的 GridControl0 并将 GridView1 添加到此控件。

    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 后刷新MainView

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


    0 - gridControl2 示例。
    1 - gridView3 示例。

    【讨论】:

    • 这非常接近,数量列最初是正确的(例如 100)。然后我过滤我的结果,然后数量列是错误的(仍然是 100),如果我展开详细视图,数量列然后更新为正确的数字(例如 50)。您知道如何在不扩展详细记录的情况下更新数量吗?
    • @Smithy 在展开之前如何过滤详细视图?
    • 我已经编辑了我的答案以详细说明它是如何完成的,但基本上我称之为:gridView2.ActiveFilterString = locationFilterString;
    • @Smithy 您需要使用«DevExpress 过滤引擎»将过滤器应用于您的GridItemModel.Inventory 列表。看看我更新的answer
    • @Smithy 是的,它仅用于后台计数。例如,我使用了GridControl。您也可以尝试使用PivotGridControlFilterControl
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多