DevExpress控件使用交流,DevExpress中国社区Dev联系电话 联系电话:023-68661681

DevExpress WinForms中文教程:Grid View - 如何实现识别行操作?(二)

来源:   发布时间:2025-03-04   浏览:307次

DevExpress WinForms拥有180+组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜任!

在本教程中,您将了解到DevExpress WinForms网格视图标识其行的方式。

  • 数据源行索引
  • 行处理
  • 可见索引

在上文中(点击这里回顾>>),我们为大家介绍了纯数据中的行标识符、排序和过滤数据时行标识符之间的差异等,本文将继续介绍分组数据时行标识符之间的差异、特殊行句柄等,欢迎下载最新版组件体验~

获取DevExpress WinForms v24.2正式版下载

DevExpress技术交流群11:749942875      欢迎一起进群讨论

分组数据时行标识符之间的差异

行句柄和数据源索引之间的差异

接下来看看分组数据时会发生什么,行句柄和数据源索引之间的关键区别之一是,组行的行句柄是负整数。显然没有用于组行的数据源索引,因为它们不存在于数据源中,因此组行中显示的值是组中第一个数据行的索引。还有一件值得注意的事情是,数据行的句柄总是非负整数。

DevExpress WinForms中文教程图集

使用行句柄遍历行

如果您想遍历网格控件内存中的所有行,可以简单地枚举从0到View的BaseView.DataRowCount属性的行句柄。

看一下Clear Name按钮的Click事件处理程序,它正是这样做的,以便为所有当前加载的行清除Name列中的值。处理程序代码被封装到BaseView.BeginUpdateBaseView.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列已被清除,但其他品牌仍然拥有该数据。

DevExpress WinForms中文教程图集

因此只有匹配筛选条件的行才会加载到内存中,如果现在按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)分配预定义的行句柄值。

DevExpress WinForms中文教程图集

要查看如何使用这些预定义值,请处理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”,焦点将保持不变。

DevExpress WinForms中文教程图集
将行标识符相互转换

网格视图提供了允许您将行标识符相互转换的方法,要了解其工作原理,请分析在此应用程序中显示行索引信息的处理程序。

有三列,一列显示可见索引,另一行显示句柄,第三列显示数据源索引,该代码首先使用作为参数传递的行句柄获取数据源索引。然后使用行句柄确定可见索引,之后所有的值都显示在相应的列中。

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

更多产品资讯及授权,欢迎来电咨询:023-68661681


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

关于慧都科技

慧都科技是专注软件工程、智能制造、石油工程三大行业的数字化解决方案服务商。在软件工程领域,我们提供开发控件、研发管理、代码开发、部署运维等软件开发全链路所需的产品,提供正版授权采购、技术选型、个性化维保等服务,帮助客户实现技术合规、降本增效与风险可控。

慧都科技是DevExpress的中国区的合作伙伴,DevExpress作为用户界面领域的优秀产品,帮助企业高效构建权限管理、数据可视化(如网格/图表/仪表盘)、跨平台系统(WinForms/ASP.NET/.NET MAUI)及行业定制解决方案,加速开发并强化交互体验。

本站文章除注明转载外,均为本站原创或翻译
欢迎任何形式的转载,但请务必注明出处,尊重他人劳动成果
转载请注明:文章转载自:DevExpress控件中文网 [https://www.devexpresscn.com/]
本文地址:https://www.devexpresscn.com/post/5051.html

相关产品: DevExpress WinForms Subscription, DevExpress Universal Subscription,

扫码咨询
电话咨询
023-68661681
返回
顶部