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
可以使用方法,若要获取筛选行,可以使用undocumentedGridView.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();