本主题说明了两种遍历行的技术 —— 遍历数据行和遍历当前可视的行。 注意,遍历行不会导致行焦点移动,而只是逐个访问行。 当需要以一种通用方式来修改行的数据时,当需要定位特定的行时,等等,则遍历行的操作可能是有用的。 本主题没有提供关于处理分组行或遍历主/从行的信息。 关于那些课题的详细信息,请参阅 处理分组行、展开和折叠主控行 和 在主控行和细节行中导航 主题。
遍历行
如同在 行与卡片识别 主题中描述的那样,所有行都有相应的称为行句柄的整数值。 数据行的句柄是连续的从 0 开始的整数。 在不同的视图中,最后一个可用数据行的句柄是由不同的属性标识的。 在卡片视图中,不能通过诸如分组等操作而导致隐藏卡片。 意思是行句柄始终与可视索引匹配。 因此,最后一个可用数据行的句柄等于 BaseView.RowCount 属性值减去 1。
网格视图支持分组功能,意思是可以在已折叠的组中隐藏某些数据行。 在这种视图中, BaseView.RowCount 属性值标识了非隐藏行的数目。 要确定数据行的数目,则使用 BaseView.DataRowCount 属性。 此外,需要把该属性值减去 1,来获得最后一个可用数据行的句柄。
一旦确定了数据行的数目,就可以遍历在视图中的所有数据行。 要达到此目的,需要一个计数器,它的取值从 0 开始 (第一个数据行的句柄) 被改变,直至获取的数目 (最后一个数据行的句柄)。 下面的示例代码展示了如何实现此任务。 它声明了一个方法,此方法把 Price 列的值减少 10%。 注意,代码同时工作于卡片视图和网格视图 (此视图被传递为方法参数)。
C# | 复制代码 |
---|---|
private void UpdatePrice(DevExpress.XtraGrid.Views.Base.ColumnView View) { // Obtain the Price column. DevExpress.XtraGrid.Columns.GridColumn col = View.Columns.ColumnByFieldName("Price"); if (col == null) return; View.BeginSort(); try { // Obtain the number of data rows. int dataRowCount = View.DataRowCount; // Traverse data rows and change the Price field values. for (int i = 0; i < dataRowCount; i++) { object cellValue = View.GetRowCellValue(i, col); double newValue = Convert.ToDouble(cellValue) * 0.9; View.SetRowCellValue(i, col, newValue); } } finally { View.EndSort(); } } |
Visual Basic | 复制代码 |
---|---|
Private Sub UpdatePrice(ByVal View As DevExpress.XtraGrid.Views.Base.ColumnView) ' Obtain the Price column. Dim Col As DevExpress.XtraGrid.Columns.GridColumn = View.Columns.ColumnByFieldName("Price") If Col Is Nothing Then Exit Sub View.BeginSort() Try ' Obtain the number of data rows. Dim DataRowCount As Integer = View.DataRowCount ' Traverse data rows and change the Price field values. Dim I As Integer For I = 0 To DataRowCount - 1 Dim CellValue As Object = View.GetRowCellValue(I, Col) Dim NewValue As Double = Convert.ToDouble(CellValue) * 0.9 View.SetRowCellValue(I, Col, NewValue) Next Finally View.EndSort() End Try End Sub |
注意,上述示例代码调用了 ColumnView.BeginSort 和 ColumnView.EndSort 方法,来避免在修改行的数据时重新加载数据。 这是有用的,因为如果对视图应用了排序,则修改单元格取值可能导致改变行的顺序 (和行句柄)。
也可以使用 ColumnView.GetVisibleRowHandle 和 ColumnView.GetNextVisibleRow 方法来遍历行。 这两个方法都返回一个行句柄,可以用于与 GridControl.InvalidRowHandle 常量相比较,来确定是否已经越过最后一行。 下面的代码展示了使用这些方法的示例。 ColumnView.GetVisibleRowHandle 方法被用于获取第一个可视行的句柄。 ColumnView.GetNextVisibleRow 方法被用于访问后续的可视行:
C# | 复制代码 |
---|---|
int currentRowHandle = gridView1.GetVisibleRowHandle(0); while(currentRowHandle != DevExpress.XtraGrid.GridControl.InvalidRowHandle) { // place any code for row processing here // ... currentRowHandle = gridView1.GetNextVisibleRow(currentRowHandle); } |
Visual Basic | 复制代码 |
---|---|
Dim CurrentRowHandle As Integer = GridView1.GetVisibleRowHandle(0) While currentRowHandle <> DevExpress.XtraGrid.GridControl.InvalidRowHandle ' place any code for row processing here ' ... CurrentRowHandle = GridView1.GetNextVisibleRow(CurrentRowHandle) End While |