New Item Row
数据网格可以显示一个空行,使用户可以添加新记录。该行由显示在相应行指示符单元格内的星号(*)标识。若要取消添加新行,用户可以按Esc键。
相关API
- GridOptionsView.NewItemRowPosition — 允许您启用一个新的项目行,并选择它应该定位到视图的上边缘还是下边缘。
- GridControl.NewItemRowHandle — 一个常量,用于指定“新建项目行”的行句柄。
Initialize New Rows
ColumnView.InitNewRow 每当用户添加新记录时,InitNewRow事件就会激发。处理此事件并调用相应的SetValue和GetValue方法,以方便用户输入并使用默认值自动填充新行单元格。
在以自定义方式初始化新添加的行的演示模块中,每一个新行都会自动接收“记录日期”、“名称”和“备注”列下单元格的初始值。
gridView.OptionsView.NewItemRowPosition = NewItemRowPosition.Top;
// Handle the InitNewRow event to initialize newly added rows. To initialize row cells, use the SetRowCellValue method.
gridView.InitNewRow += (s, e) => {
GridView view = s as GridView;
// Set the new row cell value.
view.SetRowCellValue(e.RowHandle, view.Columns["RecordDate"], DateTime.Today);
view.SetRowCellValue(e.RowHandle, view.Columns["Name"], "CustomName");
// Obtain the new row cell value.
int newRowID = Convert.ToInt32(view.GetRowCellValue(e.RowHandle, "ID"));
view.SetRowCellValue(e.RowHandle, view.Columns["Notes"], string.Format("Row ID: {0}",newRowID));
};
Data Navigator
数据导航器是一个嵌入式工具栏,允许用户浏览数据网格记录和添加/删除行。
相关API
- GridControl.UseEmbeddedNavigator—指定数据导航器是否可用。
- GridControl.EmbeddedNavigator。按钮–显示在数据导航器中的按钮。
Control Navigator
数据导航器是直接显示在数据网格中的ControlNavigator对象。如果需要,您可以创建一个独立的ControlNavigator,并将其放置在网格外的任何位置。使用导航器的
ControlNavigator.NavigatableControl属性,将导航器绑定到数据网格。控件导航器还可以浏览树状列表和垂直网格控件的记录。
Add and Remove Rows in Code
修改基础数据源
如果数据源允许用户添加和删除记录,则可以使用数据源API修改网格行。如果数据源未实现IBindingList接口,则不会向数据网格发送添加/删除通知。在这种情况下,请调用 GridControl.RefreshDataSource方法(更新主网格视图)或BaseView.RefreshData方法(用于更新此特定视图)以手动更新数据网格GridOptionsNavigation.AutoFocusNewRow属性允许数据网格自动聚焦添加到数据源的新记录。
下面的代码将新记录添加到BindingList<T>对象中,该对象用作数据网格的数据源。由于此数据源支持更新通知,因此不需要手动刷新数据网格。
private void barButtonItem1_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) {
(gridControl1.DataSource as BindingList<SalesPerson>).AddNew();
}
ColumnView.AddNewRow
将空行添加到数据网格中。如果启用了“新建项目行”,则此方法会将焦点移到此元素。否则,新记录将临时放置在现有记录的下方。用户输入单元格值并接受该行后,新行将根据当前数据组的筛选器、组和排序设置移动到其最终位置。若要手动接受新行,请调用ColumnView。来自代码的UpdateCurrentRow方法。以下代码显示如何将新行添加到数据组中。假设网格视图中的数据是根据一列或多列进行分组的。该行被添加到与当前关注的行相同的组中。
private void AddNewRowInGroupMode(DevExpress.XtraGrid.Views.Grid.GridView View) {
//Get the handle of the source data row
//The row provides 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;
}
}
}
ColumnView.DeleteRow
从视图中删除数据记录或组行。如果数据源包含多个具有主细节关系的表,则此方法将删除一行及其关联的子行。下面的代码片段演示了当用户按下Ctrl+Del快捷键时如何删除关注的行。
if (e.KeyCode == Keys.Delete && e.Modifiers == Keys.Control) {
if (MessageBox.Show("Delete row?", "Confirmation", MessageBoxButtons.YesNo) !=
DialogResult.Yes)
return;
GridView view = sender as GridView;
view.DeleteRow(view.FocusedRowHandle);
}
ColumnView.DeleteSelectedRows
如果ColumnViewOptionsSelection.MultiSelect属性已启用,用户可以选择多个数据网格行(或行单元格,具体取决于当前的GridOptionsSelection.MultiSelectMode设置)。如果启用了单个单元格选择,DeleteSelectedRows()方法将删除所有选定的行以及具有选定单元格的所有行。
How to Save a Modified Row
数据网格和其他DevExpress数据感知控件(Gantt Control、Vertical Grid、TreeList等)不与真实数据存储交互。相反,它们使用连接到这些存储器的数据源。数据感知控件将用户编辑保存到数据源,但您需要手动将这些更改发布到底层存储中。有关详细信息,请参阅本帮助主题:Post Data to an Underlying Data Source.
若要将修改后的行值发布到基础源,请处理ColumnView.RowUpdated事件。当用户导航离开编辑的行时,会触发此事件。
DXApplication.AdventureWorksDW2008R2Entities dbContext;
void gridView1_RowUpdated(object sender, RowObjectEventArgs e) {
dbContext.SaveChanges();
}
请注意,RowUpdated在存在活动编辑器时不会激发(BaseView.IsEditing属性返回true)。要手动触发此事件,请调用BaseView.CloseEditor方法关闭编辑器,然后调用BaseView.UpdateCurrentRow方法。