本主题提供了关于通过数据来查找行的信息。 它描述了两种通过单元格取值来定位行的方法,并说明了如何人工实现数据搜索。 注意,数据搜索处理意味着遍历行。 请参阅 遍历行 主题获得其他关于迭代行所用的方法的信息。
行定位
有时可能需要通过字段值来定位行。 使用 ColumnView.LocateByValue 方法来实现此目的。 此方法搜索在特定字段中包含了特定取值的行。 指定搜索起始位置的行句柄也被作为一个参数进行传递。 执行向前搜索,并且返回找到的行的句柄。
也可以使用 ColumnView.LocateByDisplayText 方法,根据显示在单元格中的文本来定位行。 此方法与 ColumnView.LocateByValue 方法类似,但是此方法使用显示字符串 (而不是单元格值) 与搜索值进行比对。 注意,显示字符串不一定是字段值的文本表示形式。 它们也可以不同,例如,在实现了单元格值的格式设置时,如同在 设置单元格取值的格式 主题中所描述的那样。
下面的示例代码展示了如何遍历 Category 字段中包含“SPORT”字符串的行。
C# | 复制代码 |
---|---|
using DevExpress.XtraGrid.Views.Base; ColumnView View = gridControl1.MainView as ColumnView; View.BeginUpdate(); try { int rowHandle = 0; DevExpress.XtraGrid.Columns.GridColumn col = View.Columns["Category"]; while(true) { // locating the next row rowHandle = View.LocateByValue(rowHandle, col, "SPORTS"); // exiting the loop if no row is found if (rowHandle == DevExpress.XtraGrid.GridControl.InvalidRowHandle) break; // perform specific operations on the row found here // ... rowHandle++; } } finally { View.EndUpdate(); } |
Visual Basic | 复制代码 |
---|---|
Dim View As DevExpress.XtraGrid.Views.Base.ColumnView = GridControl1.MainView View.BeginUpdate() Try Dim RowHandle As Integer = 0 Dim Col As DevExpress.XtraGrid.Columns.GridColumn = View.Columns("Category") While (True) ' locating the next row RowHandle = View.LocateByValue(RowHandle, Col, "SPORTS") ' exiting the loop if no row is found If RowHandle = DevExpress.XtraGrid.GridControl.InvalidRowHandle Then Exit While End If ' perform specific operations on the row found here ' ... RowHandle += 1 End While Finally View.EndUpdate() End Try |
注意,可能会出现 ColumnView.LocateByValue 和 ColumnView.LocateByDisplayText 方法不符合需求的情况。 例如,可能需要查找特定的分组行。 另一个示例是在多列中通过取值搜索数据行。 在这些情况下,需要遍历所需的行,并确定它们是否与指定的条件相匹配。 ColumnView.GetRowCellValue 或 ColumnView.GetRowCellDisplayText 方法用于检查行的数据是否与指定的值相匹配。 下面的示例代码展示了如何实现此任务。 声明的 LocateByMultipleValues 方法接受一个视图、一个列数组和一个取值数组作为参数。 此方法遍历了视图的数据行,来查找一个行 —— 在该行中,列数组中的列包含了取值数组中的取值。 注意,该方法也接受起始行句柄作为参数。 因此,该方法从视图中指定的行开始,搜索到最后一行。
C# | 复制代码 |
---|---|
using DevExpress.XtraGrid.Views.Base; using DevExpress.XtraGrid.Views.Card; using DevExpress.XtraGrid.Views.Grid; using DevExpress.XtraGrid.Columns; // ... public int LocateRowByMultipleValues(ColumnView view, GridColumn[] columns, object[] values, int startRowHandle) { // checking whether the arrays have the same length if (columns.Length != values.Length) return DevExpress.XtraGrid.GridControl.InvalidRowHandle; // obtaining the number of data rows within the view int dataRowCount; if (view is CardView) dataRowCount = (view as CardView).RowCount; else dataRowCount = (view as GridView).DataRowCount; // traversing the data rows to find a match bool match; object currValue; for (int currentRowHandle = startRowHandle; currentRowHandle < dataRowCount; currentRowHandle++) { match = true; for (int i = 0; i < columns.Length; i++) { currValue = View.GetRowCellValue(currentRowHandle, columns[i]); if (!currValue.Equals(values[i])) match = false; } if (match) return currentRowHandle; } // returning the invalid row handle if no matches found return DevExpress.XtraGrid.GridControl.InvalidRowHandle; } |
Visual Basic | 复制代码 |
---|---|
Imports DevExpress.XtraGrid.Columns Imports DevExpress.XtraGrid.Views.Base Imports DevExpress.XtraGrid.Views.Grid Imports DevExpress.XtraGrid.Views.Card ' ... Public Function LocateRowByMultipleValues(ByVal View As ColumnView, _ ByVal Columns As GridColumn(), ByVal Values As Object(), _ ByVal StartRowHandle As Integer) As Integer ' checking whether the arrays have the same length If Columns.Length <> Values.Length Then Return DevExpress.XtraGrid.GridControl.InvalidRowHandle End If ' obtaining the number of data rows within the view Dim DataRowCount As Integer If (TypeOf (View) Is CardView) Then DataRowCount = View.RowCount Else DataRowCount = CType(View, GridView).DataRowCount End If ' traversing the data rows to find a match Dim Match As Boolean Dim CurrValue As Object Dim CurrentRowHandle, I As Integer For CurrentRowHandle = StartRowHandle To DataRowCount - 1 Match = True For I = 0 To Columns.Length - 1 CurrValue = View.GetRowCellValue(CurrentRowHandle, Columns(I)) If Not CurrValue.Equals(Values(I)) Then Match = False Next If Match Then Return CurrentRowHandle Next ' returning the invalid row handle if no matches found Return DevExpress.XtraGrid.GridControl.InvalidRowHandle End Function |
下面的示例代码展示了如何使用所声明的方法。 它搜索包含了 “Condiments ”的 (在 CategoryName 列中) 和 2 (在 CategoryID 列中) 的行。 此搜索从视图中的第一个数据行开始。
C# | 复制代码 |
---|---|
GridColumn[] cols = new GridColumn[] {colCategoryName, colCategoryID}; object[] values = new object[] {"Condiments", 2}; int rowHandle = LocateRowByMultipleValues(gridView1, cols, values, 0); |
Visual Basic | 复制代码 |
---|---|
Dim Cols() As GridColumn = New GridColumn() {colCategoryName, colCategoryID} Dim Values() As Object = New Object() {"Condiments", 2} Dim RowHandle As Integer = LocateRowByMultipleValues(GridView1, Cols, Values, 0) |