视图提供了几种操作绑定数据源中记录的方法。 本章节描述添加和删除记录的方法。 获取和设置单元格的值 文档展示如何访问单元格取值。
总说明
首先,尽管可以始终使用数据源的方法来添加、删除和修改个别行。 注意,某些数据源 (例如,数组和只读集合) 不支持添加或删除行。 有些数据源提供了属性来阻止更改。 例如,当使用实现了 IBindingList 接口的数据源时,仅当 IBindingList.AllowRemove 属性值设置为 true,才能删除行; 仅当 IBindingList.AllowNew 属性返回 true,才能添加行。
但是在某些情况下,使用由视图提供的方法来修改绑定数据源更便利。 主要功能是:
-
网格控件立即反映对数据源作出的更改。
取决于数据源类型,在使用由数据源提供的功能来添加、删除或修改记录时,网格控件可能不能接收到更改通知。 如果数据源不支持更改通知,如果直接修改了数据源 (也即不使用视图提供的方法),则需要人工更新网格控件。 请参阅 刷新网格控件 文档获得更多信息。 该主题也提供了一个实现数据源通知功能的示例。
- 相同的代码可以应用于几种数据源类型。
也可以允许最终用户使用导航器控件删除行、使用导航器控件或 新建项行 功能添加行。 请参阅 使用导航器 文档获得关于使用导航器控件的细节。
添加行
在使用 ColumnView.AddNewRow 方法时,一个公共的设想是添加新行,然后让最终用户人工填充它的单元格取值。 也可以使用数据源提供的方法或 ColumnView.SetRowCellValue 方法,通过代码初始化单元格取值。
通过 ColumnView.AddNewRow 方法添加的行被显示在网格视图的最后,直至它被接受。 在行被接受之后,网格控件将根据当前的分组和排序设置,在适当的位置显示它。 可以使用许多方式接受该行:- 通过把焦点移到其他行;
- 通过添加另一行;
- 通过调用 ColumnView.UpdateCurrentRow 方法。
在行被添加之后,它的句柄立即等于 BaseView.DataRowCount 减去 1。 注意,新行被自动设置焦点,因此可以使用 ColumnView.FocusedRowHandle 属性来获取行句柄。 行的句柄很有用,例如,通过 ColumnView.SetRowCellValue 方法来修改行单元格的取值。
如果使用绑定数据源提供的方法添加行,则新行可能不会自动被设置焦点。 要确保新行始终获得焦点,则可以把 GridOptionsNavigation.AutoFocusNewRow 属性设置为 true。
对于使用 ColumnView.AddNewRow 方法添加的行,可以在 ColumnView.InitNewRow 事件处理程序中编写单元格初始化代码。
下列代码展示了如何把一个新行添加到数据组。 假设根据一个或多个列,对网格视图内的数据进行分组。 添加到相同组中的行成为当前获得焦点的行。
首先,获取当前获得焦点的行的分组列取值,并存储到一个数组中。 第二,添加一个新行,与分组列对应的字段被设置为预先存储的值。 第三,新行被接受,并且导致重新排列所有行,以符合当前的分组设置。 最后,为新行设置焦点。
C# | 复制代码 |
---|---|
private void addNewRowInGroupMode(DevExpress.XtraGrid.Views.Grid.GridView view) { //Get the handle of the source data row //The row will provide group column values for a new row int rowHandle = View.GetDataRowHandleByGroupRowHandle(view.FocusedRowHandle); //Store group column values object [] groupValues = null; int groupColumnCount = View.GroupedColumns.Count; if(groupColumnCount > 0) { groupValues = new object[groupColumnCount]; for(int i = 0; i < groupColumnCount; i++) { groupValues[i] = View.GetRowCellValue(rowHandle, View.GroupedColumns[i]); } } //Add a new row View.AddNewRow(); //Get the handle of the new row int newRowHandle = View.FocusedRowHandle; object newRow = View.GetRow(newRowHandle); //Set cell values corresponding to group columns if(groupColumnCount > 0) { for(int i = 0; i < groupColumnCount; i++) { View.SetRowCellValue(newRowHandle, View.GroupedColumns[i], groupValues[i]); } } //Accept the new row //The row moves to a new position according to the current group settings View.UpdateCurrentRow(); //Locate the new row for(int n = 0; n < View.DataRowCount; n++) { if(view.GetRow(n).Equals(newRow)) { View.FocusedRowHandle = n; break; } } } |
Visual Basic | 复制代码 |
---|---|
Private Sub addNewRowInGroupMode(ByVal View As DevExpress.XtraGrid.Views.Grid.GridView) 'Get the handle of the source data row 'The row will provide group column values for a new row Dim rowHandle As Integer = View.GetDataRowHandleByGroupRowHandle(view.FocusedRowHandle) 'Store group column values Dim groupValues() As Object = Nothing Dim groupColumnCount As Integer = View.GroupedColumns.Count Dim i As Integer If groupColumnCount > 0 Then ReDim groupValues(groupColumnCount - 1) For i = 0 To groupColumnCount - 1 groupValues(i) = View.GetRowCellValue(rowHandle, View.GroupedColumns(i)) Next End If 'Add a new row View.AddNewRow() 'Get the handle of the new row Dim newRowHandle As Integer = View.FocusedRowHandle Dim newRow As Object = View.GetRow(newRowHandle) 'Set cell values corresponding to group columns If groupColumnCount > 0 Then For i = 0 To groupColumnCount - 1 View.SetRowCellValue(newRowHandle, View.GroupedColumns(i), groupValues(i)) Next End If 'Accept the new row 'The row moves to a new position according to the current group settings View.UpdateCurrentRow() 'Locate the new row For i = 0 To View.DataRowCount If View.GetRow(i).Equals(newRow) Then View.FocusedRowHandle = i Exit For End If Next End Sub |
删除行
要从数据源中删除行,则使用 ColumnView.DeleteRow 方法。 此方法仅对支持记录删除的数据源有效。 要删除的行通过传递为参数的行句柄来标识。 从 XtraGrid 版本 3.0 开始, ColumnView.DeleteRow 方法可以删除数据行和 分组行。
如果网格控件被绑定到表间有主/从关系的 DataSet,则 ColumnView.DeleteRow 方法删除所需的行及其相关联的子行 (如果存在)。 请参阅 主/从模式概述 文档获得关于主/从模式的信息。
删除选中的行
当视图的 ColumnViewOptionsSelection.MultiSelect 属性值设置为 true 时,网格控件为视图提供多选模式。 在网格视图中,可以通过 GridOptionsSelection.MultiSelectMode 属性选择多行及多个单元格选择模式,因此可以同时选中多行或多个独立单元格。 ColumnView.DeleteSelectedRows 方法允许删除选中的行 (在多行选择模式中),或者删除包含了选中单元格的行 (在多单元格选择模式中)。 在单行选择模式中 (ColumnViewOptionsSelection.MultiSelect 属性值设置为 false 时),ColumnView.DeleteSelectedRows 方法删除获得焦点的记录。 在网格视图中,此方法也删除选中的分组行。
要获得关于选择模式的额外信息,请参阅 选择概述 文档。