翻译|使用教程|编辑:龚雪|2025-08-13 11:22:54.967|阅读 15 次
概述:本文主要介绍DevExpress WPF Grid控件如何在网格视图数据布局中遍历代码中的行和单元格,欢迎下载最新版组件体验!
# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>
相关链接:
DevExpress WPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件的衍伸产品,还是以数据为中心的商业智能产品,都能通过DevExpress WPF控件来实现。
在本文中您将学习到DevExpress WPF Grid控件如何在网格视图数据布局中遍历代码中的行和单元格,欢迎下载最新版组件体验!
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属性不考虑:
注意:当您在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.Columns或 GridViewBase.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.Columns或GridViewBase.VisibleColumns集合。要遍历bands中的列,请从GridControl.Bands集合中获取并使用GridControlBand.Columns集合属性。
TreeListView将节点表示为行,您可以使用上面列出的技术来遍历可见节点及其单元。
GridControl包括以下类型的详细描述符:
注意:只有在展开主行时,详细GridControl才可用。
要遍历详细行,需要访问详细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中,您只能获得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在其选项卡中显示不同类型的详细信息(ContentDetailDescriptor和DataControlDetailDescriptor),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
文章转载自:慧都网