DevExpress WPF中文教程:网格视图数据布局 - 遍历代码中的行和单元格

翻译|使用教程|编辑:龚雪|2025-08-13 11:22:54.967|阅读 10 次

概述:本文主要介绍DevExpress WPF Grid控件如何在网格视图数据布局中遍历代码中的行和单元格,欢迎下载最新版组件体验!

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

相关链接:

DevExpress WPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件的衍伸产品,还是以数据为中心的商业智能产品,都能通过DevExpress WPF控件来实现。

在本文中您将学习到DevExpress WPF Grid控件如何在网格视图数据布局中遍历代码中的行和单元格,欢迎下载最新版组件体验!

获取DevExpress WPF v25.1正式版下载

DevExpress技术交流群11:749942875      欢迎一起进群讨论

本文演示如何逐个访问数据项。

遍历行

DevExpress WPF GridControl通过句柄或可见索引标识数据行,DataControlBase.VisibleRowCount属性返回可见组和数据行的总数。为了遍历行,使用一个从0到DataControlBase.VisibleRowCount属性值的计数器。在这个代码示例中,我们使用GridControl.GetRowHandleByVisibleIndex方法来获取行句柄:

XAML

<dxg:GridControl x:Name="grid" ItemsSource="{Binding Source}" .../>

C#

List<int> rowHandles = new List<int>();
for (int i = 0; i < grid.VisibleRowCount; i++) {
int rowHandle = grid.GetRowHandleByVisibleIndex(i);
rowHandles.Add(rowHandle);
}

VB.NET

Dim rowHandles As List(Of Integer) = New List(Of Integer)()

For i As Integer = 0 To grid.VisibleRowCount - 1
Dim rowHandle As Integer = grid.GetRowHandleByVisibleIndex(i)
rowHandles.Add(rowHandle)
Next

DataControlBase.VisibleRowCount属性不考虑:

  • 折叠组中的行
  • 用过滤器隐藏的行
  • 服务行(自动筛选行、新建项行)
  • 来自GridControls详细的行

注意:当您在GridControl的底部显示New Item Row时,DataControlBase.VisibleRowCount属性将其视为常规行。

要遍历分组中的折叠行,请使用GridControl.GetChildRowCount方法。此方法返回分组中当前行的计数。创建一个类似于前一个的计数器,并使用GridControl.GetChildRowHandle方法来获取组中行的句柄,使用GridControl.IsGroupRowHandle 方法检查行是否为分组行。

下面的示例展示如何获取视图中所有数据行的句柄(包括折叠组中的行),除了被过滤掉的行:

C#

private List<int> GetDataRowHandles() {
List<int> rowHandles = new List<int>();
for (int i = 0; i < grid.VisibleRowCount; i++) {
int rowHandle = grid.GetRowHandleByVisibleIndex(i);
if (grid.IsGroupRowHandle(rowHandle)) {
if (!grid.IsGroupRowExpanded(rowHandle)) {
rowHandles.AddRange(GetDataRowHandlesInGroup(rowHandle));
}
}
else
rowHandles.Add(rowHandle);
}
return rowHandles;
}
private List<int> GetDataRowHandlesInGroup(int groupRowHandle) {
List<int> rowHandles = new List<int>();
for (int i = 0; i < grid.GetChildRowCount(groupRowHandle); i++) {
int rowHandle = grid.GetChildRowHandle(groupRowHandle, i);
if (grid.IsGroupRowHandle(rowHandle)) {
rowHandles.AddRange(GetDataRowHandlesInGroup(rowHandle));
}
else
rowHandles.Add(rowHandle);
}
return rowHandles;
}

VB.NET

Private Function GetDataRowHandles() As List(Of Integer)
Dim rowHandles As List(Of Integer) = New List(Of Integer)()

For i As Integer = 0 To grid.VisibleRowCount - 1
Dim rowHandle As Integer = grid.GetRowHandleByVisibleIndex(i)

If grid.IsGroupRowHandle(rowHandle) Then

If Not grid.IsGroupRowExpanded(rowHandle) Then
rowHandles.AddRange(GetDataRowHandlesInGroup(rowHandle))
End If
Else
rowHandles.Add(rowHandle)
End If
Next

Return rowHandles
End Function

Private Function GetDataRowHandlesInGroup(ByVal groupRowHandle As Integer) As List(Of Integer)
Dim rowHandles As List(Of Integer) = New List(Of Integer)()

For i As Integer = 0 To grid.GetChildRowCount(groupRowHandle) - 1
Dim rowHandle As Integer = grid.GetChildRowHandle(groupRowHandle, i)

If grid.IsGroupRowHandle(rowHandle) Then
rowHandles.AddRange(GetDataRowHandlesInGroup(rowHandle))
Else
rowHandles.Add(rowHandle)
End If
Next

Return rowHandles
End Function
遍历单元格

DevExpress WPF GridControl通过行句柄和列对象定义单元格,要遍历单元格,扩展在遍历行部分中描述的技术,遍历GridControl.ColumnsGridViewBase.VisibleColumns / TreeListView.VisibleColumns集合来访问可见单元格:

C#

for (int i = 0; i < grid.VisibleRowCount; i++) {
int rowHandle = grid.GetRowHandleByVisibleIndex(i);
foreach (var column in grid.Columns) {
var cellValue = grid.GetCellValue(rowHandle, column);
}
}

VB.NET

For i As Integer = 0 To grid.VisibleRowCount - 1
Dim rowHandle As Integer = grid.GetRowHandleByVisibleIndex(i)

For Each column In grid.Columns
Dim cellValue = grid.GetCellValue(rowHandle, column)
Next
Next

要遍历所有bands中的列,请使用GridControl.ColumnsGridViewBase.VisibleColumns集合。要遍历bands中的列,请从GridControl.Bands集合中获取并使用GridControlBand.Columns集合属性。

遍历节点

TreeListView将节点表示为行,您可以使用上面列出的技术来遍历可见节点及其单元。

在Master-Detail GridControl中遍历Detail行

GridControl包括以下类型的详细描述符:

注意:只有在展开主行时,详细GridControl才可用。

DataControlDetailDescriptor

要遍历详细行,需要访问详细GridControl的实例。使用在遍历行部分中描述的技术,并使用GridControl.IsMasterRowExpanded 方法来检查是否展开了主行。使用GridControl.GetDetail方法来获得扩展的GridControl详细,并遍历它的行:

C#

Dictionary<int, List<int>> master_detail = new Dictionary<int, List<int>>();

for (int i = 0; i < masterGridControl.VisibleRowCount; i++) {
int rowHandle = masterGridControl.GetRowHandleByVisibleIndex(i);
List<int> details = new List<int>();
master_detail[rowHandle] = details;
if (masterGridControl.IsMasterRowExpanded(rowHandle)) {
var detailGrid = masterGridControl.GetDetail(rowHandle) as GridControl;
for (int j = 0; j < detailGrid.VisibleRowCount; j++) {
int detailRowHandle = detailGrid.GetRowHandleByVisibleIndex(j);
details.Add(detailRowHandle);
}
}
}

VB.NET

Dim master_detail As Dictionary(Of Integer, List(Of Integer)) = New Dictionary(Of Integer, List(Of Integer))()

For i As Integer = 0 To masterGridControl.VisibleRowCount - 1
Dim rowHandle As Integer = masterGridControl.GetRowHandleByVisibleIndex(i)
Dim details As List(Of Integer) = New List(Of Integer)()
master_detail(rowHandle) = details

If masterGridControl.IsMasterRowExpanded(rowHandle) Then
Dim detailGrid = TryCast(masterGridControl.GetDetail(rowHandle), GridControl)

For j As Integer = 0 To detailGrid.VisibleRowCount - 1
Dim detailRowHandle As Integer = detailGrid.GetRowHandleByVisibleIndex(j)
details.Add(detailRowHandle)
Next
End If
Next

使用DataViewBaseFocusedView属性来访问焦点详细GridControl并遍历它的行:

C#

var focusedDetail = masterView.FocusedView as TableView;
if (focusedDetail != null) {
List<int> rowHandles = new List<int>();
for (int i = 0; i < focusedDetail.Grid.VisibleRowCount; i++) {
int rowHandle = focusedDetail.Grid.GetRowHandleByVisibleIndex(i);
rowHandles.Add(rowHandle);
}
}

VB.NET

Dim focusedDetail = TryCast(masterView.FocusedView, TableView)

If focusedDetail IsNot Nothing Then
Dim rowHandles As List(Of Integer) = New List(Of Integer)()

For i As Integer = 0 To focusedDetail.Grid.VisibleRowCount - 1
Dim rowHandle As Integer = focusedDetail.Grid.GetRowHandleByVisibleIndex(i)
rowHandles.Add(rowHandle)
Next
End If
ContentDetailDescriptor

ContentDetailDescriptor中,您只能获得GridControl视图中可见的内容。

要遍历详细行,需要访问详细GridControl的实例。使用LayoutTreeHelper类迭代主GridControl的可视化树,并访问详细GridControl的行:

C#

var detailGrids = LayoutTreeHelper.GetVisualChildren(masterGridControl).OfType<GridControl>();

foreach(var detailGrid in detailGrids) {
List<int> rowHandles = new List<int>();
for (int i = 0; i < detailGrid.VisibleRowCount; i++) {
int rowHandle = detailGrid.GetRowHandleByVisibleIndex(i);
rowHandles.Add(rowHandle);
}
}

VB.NET

Dim detailGrids = LayoutTreeHelper.GetVisualChildren(masterGridControl).OfType(Of GridControl)()

For Each detailGrid In detailGrids
Dim rowHandles As List(Of Integer) = New List(Of Integer)()

For i As Integer = 0 To detailGrid.VisibleRowCount - 1
Dim rowHandle As Integer = detailGrid.GetRowHandleByVisibleIndex(i)
rowHandles.Add(rowHandle)
Next
Next
TabViewDetailDescriptor

TabViewDetailDescriptor在其选项卡中显示不同类型的详细信息(ContentDetailDescriptorDataControlDetailDescriptor),GridControl只会为选中的选项卡创建一个可视元素。要遍历选项卡中的详细行,请使用详细描述符主题中描述的技术。

GridControl.GetDetail方法的重写接受DataControlDetailDescriptor对象,使用这个覆盖来获得 TabViewDetailDescriptor的标签中显示的GridControl:

XAML

<dxg:GridControl.DetailDescriptor>
<dxg:TabViewDetailDescriptor>
<dxg:DataControlDetailDescriptor x:Name="firstDetailDescriptor" ItemsSourceBinding="{Binding Data}">
<dxg:GridControl AutoGenerateColumns="AddNew" x:Name="detailGridControl">
<dxg:GridControl.View>
<dxg:TableView x:Name="detailView"/>
</dxg:GridControl.View>
</dxg:GridControl>
</dxg:DataControlDetailDescriptor>
</dxg:TabViewDetailDescriptor>
</dxg:GridControl.DetailDescriptor>

C#

Dictionary<int, List<int>> master_detail = new Dictionary<int, List<int>>();

for (int i = 0; i < masterGridControl.VisibleRowCount; i++) {

int rowHandle = masterGridControl.GetRowHandleByVisibleIndex(i);

List<int> details = new List<int>();
master_detail[rowHandle] = details;

if (masterGridControl.IsMasterRowExpanded(rowHandle)) {

var detailGrid = masterGridControl.GetDetail(rowHandle, firstDetailDescriptor) as GridControl;
if (detailGrid == null)
return;

for (int j = 0; j < detailGrid.VisibleRowCount; j++) {
int detailRowHandle = detailGrid.GetRowHandleByVisibleIndex(j);
details.Add(detailRowHandle);
}
}
}

VB.NET

Dim master_detail As Dictionary(Of Integer, List(Of Integer)) = New Dictionary(Of Integer, List(Of Integer))()

For i As Integer = 0 To masterGridControl.VisibleRowCount - 1
Dim rowHandle As Integer = masterGridControl.GetRowHandleByVisibleIndex(i)
Dim details As List(Of Integer) = New List(Of Integer)()
master_detail(rowHandle) = details

If masterGridControl.IsMasterRowExpanded(rowHandle) Then
Dim detailGrid = TryCast(masterGridControl.GetDetail(rowHandle, firstDetailDescriptor), GridControl)
If detailGrid Is Nothing Then Return

For j As Integer = 0 To detailGrid.VisibleRowCount - 1
Dim detailRowHandle As Integer = detailGrid.GetRowHandleByVisibleIndex(j)
details.Add(detailRowHandle)
Next
End If
Next

更多产品资讯及授权,欢迎来电咨询:023-68661681


更多DevExpress线上公开课、中文教程资讯请上中文网获取

关于慧都科技

慧都是⼀家⾏业数字化解决⽅案公司,专注于软件、⽯油与⼯业领域,以深⼊的业务理解和⾏业经验,帮助企业实现智能化转型与持续竞争优势。

慧都是DevExpress的中国区的合作伙伴,DevExpress作为用户界面领域的优秀产品,帮助企业高效构建权限管理、数据可视化(如网格/图表/仪表盘)、跨平台系统(WinForms/ASP.NET/.NET MAUI)及行业定制解决方案,加速开发并强化交互体验。


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:慧都网

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP