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

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

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

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

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

遍历行

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.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.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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值