DevExpress如何获取父GridView列以显示子GridView列的总和

时间:2015-01-14 14:03:38

标签: c# gridview devexpress

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

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

然后使我的网格看起来像这样:

enter image description here

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

我到目前为止已覆盖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应用过滤字符串时过滤详细视图的内容。

1 个答案:

答案 0 :(得分:2)

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

  • GridControl
  • PivotGridControl
  • FilterControl
  • e.t.c。

以下是gridView1_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;

此外,您需要在将过滤器设置为MainView后重新设置DetailView

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


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