DevExpress WinForms中文教程:Grid View - 如何实现识别行操作?(二) DevExpress WinForms拥有180组件和UI库能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序无论是Office风格的界面还是分析处理大批量的业务数据它都能轻松胜任在本教程中您将了解到DevExpress WinForms网格视图标识其行的方式。数据源行索引行处理可见索引在上文中我们为大家介绍了纯数据中的行标识符、排序和过滤数据时行标识符之间的差异等本文将继续介绍分组数据时行标识符之间的差异、特殊行句柄等~DevExpress新旧版本帮助文档获取可点击这篇文章查看——《界面控件DevExpress v26.1帮助文档大全CHM版本》分组数据时行标识符之间的差异行句柄和数据源索引之间的差异接下来看看分组数据时会发生什么行句柄和数据源索引之间的关键区别之一是组行的行句柄是负整数。显然没有用于组行的数据源索引因为它们不存在于数据源中因此组行中显示的值是组中第一个数据行的索引。还有一件值得注意的事情是数据行的句柄总是非负整数。使用行句柄遍历行如果您想遍历网格控件内存中的所有行可以简单地枚举从0到View的BaseView.DataRowCount属性的行句柄。看一下Clear Name按钮的Click事件处理程序它正是这样做的以便为所有当前加载的行清除Name列中的值。处理程序代码被封装到BaseView.BeginUpdate和BaseView.EndUpdate方法调用中以避免对视图进行多次更新。它从等于0的行句柄开始然后枚举到BaseView.DataRowCount属性值为止的所有整数循环体调用ColumnView.SetRowCellValue 方法来清除Name列中的值。C#private void barButtonClearName_ItemClick(object sender, ItemClickEventArgs e) { gridView1.BeginUpdate(); int rowHandle 0; while (rowHandle gridView1.DataRowCount) { gridView1.SetRowCellValue(rowHandle, colName, string.Empty); rowHandle; } gridView1.EndUpdate(); }运行应用程序。首先过滤记录只显示Audis单击该按钮并查看清除的名称。现在删除过滤并通过Make对数据进行分组您将看到Audis组中的Name列已被清除但其他品牌仍然拥有该数据。因此只有匹配筛选条件的行才会加载到内存中如果现在按Clear Name 按钮更改将影响展开或折叠组中的所有行。行句柄和可见索引之间的差异分组视图还揭示了行句柄和可见索引之间的重要区别。首先可见索引仍然从0开始并且该值随着每个可见行无论是组行还是数据行而增加。其次您会注意到行句柄已经分配给加载到内存中的所有行包括折叠组中的行对组行的展开和折叠操作不会影响行句柄。另一方面可视索引将在每次展开状态更改时重新计算以考虑已变为可见或隐藏的行。使用可见索引为了说明可见索引的用法实现一个导航到视图中下一个可见行的按钮——这是按下DOWN键的替代方法。处理程序首先使用GridView.GetVisibleIndex 方法确定焦点行的可见索引该方法将行句柄作为参数。接下来代码增加获得的可见索引最后使用GridView.GetVisibleRowHandle 方法将其转换回行句柄值并使用这个新获得的句柄设置焦点。C#private void barButtonNextRow_ItemClick(object sender, ItemClickEventArgs e) { int visibleIndex gridView1.GetVisibleIndex(gridView1.FocusedRowHandle); visibleIndex; gridView1.FocusedRowHandle gridView1.GetVisibleRowHandle(visibleIndex); }特殊行句柄本教程中最后值得一提的一点是为特殊类型的行如New Item Row分配预定义的行句柄值。要查看如何使用这些预定义值请处理ColumnView.BeforeLeaveRow事件。网格控件具有指定它们的静态字段这还包括GridControl.InvalidRowHandle值如果无法获得行句柄则由某些方法返回该值。在代码中检查当前行是否为New Item Row如果是则显示确认消息框。C#private void gridView1_BeforeLeaveRow(object sender, DevExpress.XtraGrid.Views.Base.RowAllowEventArgs e) { if (e.RowHandle DevExpress.XtraGrid.GridControl.NewItemRowHandle) { DialogResult result MessageBox.Show(Are you done editing the new record?, Confirmation, MessageBoxButtons.YesNo); e.Allow (result System.Windows.Forms.DialogResult.Yes); } }运行应用程序聚焦新建项目行然后尝试将焦点更改回其中一个数据行。如果单击“No”焦点将保持不变。将行标识符相互转换网格视图提供了允许您将行标识符相互转换的方法要了解其工作原理请分析在此应用程序中显示行索引信息的处理程序。有三列一列显示可见索引另一行显示句柄第三列显示数据源索引该代码首先使用作为参数传递的行句柄获取数据源索引。然后使用行句柄确定可见索引之后所有的值都显示在相应的列中。C#using DevExpress.XtraGrid.Views.Grid; //... private void GridView1_CustomDrawCell(object sender, DevExpress.XtraGrid.Views.Base.RowCellCustomDrawEventArgs e) { GridView view sender as GridView; int dataSourceRowIndex view.GetDataSourceRowIndex(e.RowHandle); int visibleIndex view.GetVisibleIndex(e.RowHandle); if(e.Column.FieldName gridColumnRowHandle) e.DisplayText e.RowHandle.ToString(); if(e.Column.FieldName gridColumnVisibleIndex) e.DisplayText visibleIndex.ToString(); if(e.Column.FieldName gridColumnListSourceIndex) e.DisplayText dataSourceRowIndex.ToString(); }