获取和修改代码中的单元格值
提醒:仅当网格及其列已完全初始化时,才使用以下方法。如果您需要在表单仍在加载时调用这些方法,请调用ForceInitialize()方法来强制Grid完成初始化。
单元格 | 读取单元格值 | 更改单元格值 |
---|---|---|
focused cell | ColumnView.GetFocusedValue ColumnView.FocusedValue | ColumnView.SetFocusedValue |
cell of a focused row | ColumnView.GetFocusedRowCellValue ColumnView.GetFocusedRowCellDisplayText | ColumnView.SetFocusedRowCellValue |
Any row cell | ColumnView.GetRowCellValue ColumnView.GetRowCellDisplayText | ColumnView.SetRowCellValue |
cell value in an underlying data source | ColumnView.GetListSourceRowCellValue | |
The currently edited cell | ColumnView.EditingValue | ColumnView.EditingValue |
ColumnView.CellValueChanging和ColumnView。当用户更改单元格值时,会引发CellValueChanged事件。
- 下面的代码检索属于“ID”列和第三个数据行(行句柄等于2)的单元格的值。
string cellValue;
cellValue = gridView1.GetRowCellValue(2, "ID").ToString();
- 此代码返回当前关注单元格内显示的文本。
string cellValue = gridView1.GetFocusedDisplayText();
- 此示例更改聚焦单元格的值。
gridView1.SetRowCellValue(gridView1.FocusedRowHandle, gridView1.FocusedColumn, "New Value");
//or
gridView1.SetFocusedValue("New Value");
- 网格单元格编辑器等待用户将焦点移动到另一个单元格或行,然后才接受其新值。下面的代码强制编辑器立即更新其值。
BaseEdit edit = null;
private void gridView1_ShownEditor(object sender, EventArgs e)
{
GridView view = sender as GridView;
edit = view.ActiveEditor;
edit.EditValueChanged += edit_EditValueChanged;
}
void edit_EditValueChanged(object sender, EventArgs e)
{
gridView1.PostEditor();
}
private void gridView1_HiddenEditor(object sender, EventArgs e)
{
edit.EditValueChanged -= edit_EditValueChanged;
edit = null;
}
- 在Change column cell values based on other column’s values demo中,如果输入的“Length”大于10,则会自动选中“Mark”列下的复选框,否则会清除。
gridView.CellValueChanged += (sender, e) => {
GridView view = sender as GridView;
if (e.Column.FieldName == "Length") {
double doubleVal = (double)e.Value;
view.SetRowCellValue(e.RowHandle, "Mark", doubleVal > 10);
}
};
单元格编辑器
默认单元格编辑器
网格列使用数据编辑器来显示和编辑数据。列根据其显示的数据类型自动创建编辑器。例如,显示日期时间值的列使用DateEdit。
在设计时替换默认单元格编辑器
调用列的智能标记菜单并使用GridColumn.ColumnEdit属性的下拉列表,以创建新编辑器或选择现有编辑器。
您还可以运行数据网格设计器并打开其在位编辑器存储库页面以访问所有在位编辑器。您可以添加、自定义和删除存储库项目。
创建单元格编辑器并将其指定给代码中的列
// Creates a 'ToggleSwitch' repository item.
RepositoryItemToggleSwitch edit = new RepositoryItemToggleSwitch();
// Adds the repository item to the grid's RepositoryItems collection.
gridControl.RepositoryItems.Add(edit);
// Assigns the repository item to the 'Mark' column.
gridView.Columns["Mark"].ColumnEdit = edit;
案例
如何在具有数值的列中显示进度条
下面的代码说明了如何使用ProgressBarControl作为整数“相关性”网格列的就地编辑器。用户可以点击或按住数字键盘“+”和“-”键来修改这些整数值。
using DevExpress.XtraGrid.Views.Grid;
using DevExpress.XtraEditors.Repository;
// Create a repository item
RepositoryItemProgressBar ieProgress = new RepositoryItemProgressBar();
gridControl1.RepositoryItems.Add(ieProgress);
ieProgress.KeyPress += IeProgress_KeyPress;
// Assign the repository item
colRelevance.ColumnEdit = ieProgress;
// Or
private void GridView1_CustomRowCellEdit(object sender, CustomRowCellEditEventArgs e) {
if (e.Column == colRelevance) e.RepositoryItem = ieProgress;
}
// Handle + and - key presses
private void IeProgress_KeyPress(object sender, KeyPressEventArgs e) {
int i = 0;
if (gridView1.ActiveEditor == null) return;
if (e.KeyChar == '+') {
i = (int)gridView1.ActiveEditor.EditValue;
if (i < 100)
gridView1.ActiveEditor.EditValue = i + 1;
}
if (e.KeyChar == '-') {
i = (int)gridView1.ActiveEditor.EditValue;
if (i > 0)
gridView1.ActiveEditor.EditValue = i - 1;
}
}
如何在单元格中显示按钮
如何在单元格中显示按钮编辑和删除行的单元格命令演示有一个带有按钮编辑单元格编辑器的“命令”列。编辑器有两个按钮:Edit调用Edit Form,Delete删除当前行
// Create the Commands column editor
RepositoryItemButtonEdit commandsEdit = new RepositoryItemButtonEdit { AutoHeight = false, Name = "CommandsEdit", TextEditStyle = TextEditStyles.HideTextEditor };
commandsEdit.Buttons.Clear();
commandsEdit.Buttons.AddRange(new EditorButton[] {
new EditorButton(ButtonPredefines.Glyph, "Edit", -1, true, true, false, ImageLocation.MiddleLeft, DemoHelper.GetEditImage()),
new EditorButton(ButtonPredefines.Glyph, "Delete", -1, true, true, false, ImageLocation.MiddleLeft, DemoHelper.GetDeleteImage())});
grid.RepositoryItems.Add(commandsEdit);
// Create an unbound Commands column
GridColumn _commandsColumn = gridView.Columns.AddField("Commands");
_commandsColumn.UnboundDataType = typeof(object);
_commandsColumn.Visible = true;
_commandsColumn.Width = 100;
// Hide commandsColumn from EditForm
_commandsColumn.OptionsEditForm.Visible = DevExpress.Utils.DefaultBoolean.False;
// Display commands only for the focused row
gridView.CustomRowCellEdit += (s, e) => {
if (e.RowHandle == gridView.FocusedRowHandle && e.Column == _commandsColumn)
e.RepositoryItem = commandsEdit;
};
gridView.CustomRowCellEditForEditing += (s, e) => {
if (e.RowHandle == gridView.FocusedRowHandle && e.Column == _commandsColumn)
e.RepositoryItem = commandsEdit;
};
// Allow only commandsColumn to be edited
gridView.ShowingEditor += (s, e) => {
e.Cancel = gridView.FocusedColumn != _commandsColumn;
};
gridView.OptionsEditForm.ShowOnDoubleClick = DevExpress.Utils.DefaultBoolean.False;
gridView.OptionsEditForm.ShowOnEnterKey = DevExpress.Utils.DefaultBoolean.False;
gridView.OptionsEditForm.ShowOnF2Key = DevExpress.Utils.DefaultBoolean.False;
gridView.OptionsBehavior.EditingMode = GridEditingMode.EditFormInplace;
// Perform a specific action when an EditorButton is clicked
commandsEdit.ButtonClick += (s, e) => {
switch (e.Button.Caption) {
case "Edit":
// Start editing a row using EditForm
gridView.CloseEditor();
gridView.ShowEditForm();
break;
case "Delete":
// Delete focused row
gridView1.DeleteRow(gridView1.FocusedRowHandle);
break;
}
};
如何对同一列的单元格使用不同的编辑器
在Assign就地编辑器动态演示中,“Length”列接收SpinEdit或CalcEdit编辑器,具体取决于是否选中了“Mark”列下的复选框。
RepositoryItemSpinEdit spinEdit = new RepositoryItemSpinEdit();
RepositoryItemCalcEdit calcEdit = new RepositoryItemCalcEdit();
grid.RepositoryItems.Add(spinEdit);
grid.RepositoryItems.Add(calcEdit);
gridView.Columns["Length"].ShowButtonMode = ShowButtonModeEnum.ShowAlways;
// Handle this event to assign editors to individual cells
gridView.CustomRowCellEdit += (sender, e) => {
GridView view = sender as GridView;
if (e.Column.FieldName == "Length") {
bool boolVal = (bool)view.GetRowCellValue(e.RowHandle, "Mark");
if (boolVal)
e.RepositoryItem = spinEdit;
else
e.RepositoryItem = calcEdit;
}
};
在网格单元格中显示任何UI控件
使用RepositoryItemAnyControl将UI控件嵌入到网格单元格中。控件必须实现 DevExpress.XtraEditors.CustomEditor.IAnyControlEdit 接口。DevExpress仪表控制和图表控制实现了开箱即用的界面。您需要手动实现此接口,以便在网格单元格中嵌入其他UI控件。
下图显示了带有嵌入式DevExpress Chart控件的网格单元。
使用不同的编辑器显示和编辑单元值
列使用相同的编辑器来显示和编辑其值。处理CustomRowCellEditForEditing事件以使用不同的编辑器来显示和编辑列值。
以下示例演示如何使用ProgressBarControl在“数量”列中显示数值,以及如何使用SpinEdit编辑单元格值。
// Creates two repository items.
RepositoryItem editorForDisplay, editorForEditing;
// Initializes the repository items.
editorForDisplay = new RepositoryItemProgressBar();
editorForEditing = new RepositoryItemSpinEdit();
// Forces the grid to initialize its settings.
gridControl1.ForceInitialize();
// Adds the repository items to the grid's RepositoryItems collection.
gridView1.GridControl.RepositoryItems.AddRange(
new RepositoryItem[] { editorForDisplay, editorForEditing });
// Assign the 'Progress Bar' repository item to the numeric 'Quantity' column.
gridView1.Columns["charge_total"].ColumnEdit = editorForDisplay;
/* Handles the 'CustomRowCellEditForEditing' event to create a Spin Editor
* when a user edits a cell value in the 'Quantity' column.
*/
gridView1.CustomRowCellEditForEditing += (sender, e) => {
if (e.Column.FieldName == "charge_total")
e.RepositoryItem = editorForEditing;
};
API管理单元格编辑器
AP | Description |
---|---|
BaseView.ShowEditor | 调用聚焦单元格的编辑器。 |
BaseView.HideEditor | 关闭活动编辑器并放弃所做的更改 |
BaseView.CloseEditor | 保存所做的任何更改并关闭活动编辑器。 |
BaseView.PostEditor | 在不关闭活动编辑器的情况下保存所做的任何更改。 |
BaseView.ActiveEditor | 获取活动编辑器。 |
ColumnView.ShownEditor | 当网格激活在位编辑器时激发。以下示例显示了当用户开始编辑OrderDate列中的值时,如何指定当前日期并打开DateEdit的下拉列表。 |
ColumnView.HiddenEditor | 当在位编辑器关闭时激发。以下示例演示如何在关闭活动编辑器后将单元格焦点移动到列中的下一个单元格。用户无需将焦点从一个单元格移动到另一个单元格即可编辑列中的单元格值。 |
OptionsBehavior.EditorShowMode | 指定鼠标如何激活单元格编辑器。以下示例显示了如何始终显示编辑器按钮,并允许用户在第一次单击时单击编辑器按钮: |
在单独的表单中编辑数据
编辑表单模式
用户可以使用“编辑表单”而不是在位编辑器来编辑数据行。双击网格行或按Enter键或F2键调用编辑窗体。使用EditingMode属性指定编辑模式。
基于网格的视图支持以下编辑表单显示模式:
- 浮动模态形式(默认)
- 带数据行的内联编辑表单(网格在编辑的数据行下方显示编辑表单)
- 内联编辑窗体(网格不显示编辑的行)
Edit Form API
API | Description |
---|---|
GridOptionsBehavior.EditingMode | Allows you to turn on the Edit Form and specify its display mode. |
GridView.ShowEditForm GridView.HideEditForm | Allow you to display and hide the Edit Form. |
GridOptionsEditForm.ActionOnModifiedRowChange | Specifies whether to show confirmation dialogs when users modify records. |
GridOptionsEditForm.ShowUpdateCancelPanel | Specifies whether to display the Update and Cancel buttons. Ctrl+Enter saves the changes. Esc discards the changes. |
GridOptionsEditForm.BindingMode | Specifies whether to pass changes to the Grid immediately after a user moves focus to another field in the Edit Form, or after all changes have been accepted. |
GridOptionsEditForm.FormCaptionFormat | Specifies the caption of a Floating Edit Form. |
GridView.EditFormShowing | Fires before the Edit Form is displayed. Handle this event to hide the Edit Form and prevent a user from editing values in certain cells. The following example prevents a user from editing cell values in even rows: |
更改编辑表单字段中的值–实现自定义编辑逻辑
编辑窗体是一个包含数据编辑器(字段)的容器控件。数据编辑器绑定到数据记录中相应的字段/属性。执行以下操作之一以指定这些数据编辑器的值:
- 创建一个自定义的编辑表单并实现数据编辑器所需的行为。
- 处理GridView.EditFormPrepared事件,用于访问和自定义显示在编辑窗体中的编辑器。
以下示例处理EditFormPrepared事件,以便在用户打开编辑表单时聚焦“第一个”日期编辑器。
using DevExpress.XtraGrid.Views.Grid;
// ...
gridView.OptionsBehavior.EditingMode = GridEditingMode.EditForm;
DateEdit dateEdit = null;
gridView.EditFormPrepared += (s, e) => {
// The 'e.BindableControls' collection contains the editors in the Edit Form.
foreach (Control item in e.BindableControls) {
dateEdit = item as DateEdit;
if (dateEdit != null) {
// Focuses the Date Editor.
dateEdit.Select();
return;
}
}
};
更改编辑表单布局
Grid控件根据以下规则创建“编辑表单”:
- “编辑窗体”为每个可见的可编辑列显示一个编辑器。
- 如果列使用不同的编辑器来编辑和显示单元格值,则“编辑窗体”将显示“编辑”模式中使用的编辑器。
- 编辑表单的客户端区域有一个包含三列的表格布局。每个编辑器(MemoEdit和PictureEdit除外)都占用表中的一个单元格。
- MemoEdit编辑器横向跨越所有布局列,纵向跨越三个布局行。
- PictureEdit编辑器横向跨越两个布局列,纵向跨越三个布局行
调用数据网格设计器并切换到“编辑窗体设计器”页面以自定义“编辑窗体”的布局。
编辑表单API
API | Description |
---|---|
GridColumn.OptionsEditForm | 使用此属性可以自定义在“编辑窗体”中显示的列编辑器。 |
OptionsColumnEditForm.UseEditorColRowSpan | 禁用此选项可以为列的编辑器设置自定义列和行跨度。 |
OptionsColumnEditForm.ColumnSpan / OptionsColumnEditForm.RowSpan | 指定列编辑器所跨越的列和行数。 |
OptionsColumnEditForm.Caption / OptionsColumnEditForm.CaptionLocation | 允许您指定编辑器的标题及其位置。 |
OptionsColumnEditForm.Visible / OptionsColumnEditForm.VisibleIndex | 使用这些属性可以隐藏编辑器或指定其在其他编辑器中的位置。 |
OptionsColumnEditForm.StartNewRow | 启用此选项可在新行上显示编辑器。 |
创建自定义编辑表单
- 创建用户控件。从EditFormUserControl类继承它。如果用户控件有分部类,则它们还必须继承EditFormUserControl类。
- 创建编辑表单UI(根据需要自定义用户控件)。
- 使用父类的BoundFieldName和BoundPropertyName属性将编辑器绑定到数据源字段。
- 将自定义编辑窗体的实例分配给网格的GridOptionsEditForm.CustomEditFormLayout属性。
- 将自定义编辑形状的单独实例指定给每个局部视图,以便在主详细信息模式下的局部视图中使用自定义编辑形状。
using DevExpress.XtraGrid.Views.Grid;
// Custom Edit Form
public class AdvancedEditForm : EditFormUserControl {
public AdvancedEditForm() {
InitializeComponent();
// Binds the 'EditValue' of the 'textEdit3' editor to the Price field.
this.SetBoundFieldName(textEdit3, "Price");
this.SetBoundPropertyName(textEdit3, "EditValue");
}
}
// Enables the Custom Edit Form.
gridView1.OptionsEditForm.CustomEditFormLayout = new AdvancedEditForm();
// Enables the Custom Edit Form to edit values in detail views in Master-Detail mode.
void gridControl1_ViewRegistered(object sender, DevExpress.XtraGrid.ViewOperationEventArgs e) {
GridView detailCloneView = e.View as GridView;
if(detailCloneView.LevelName == "Order_Details")
detailCloneView.OptionsEditForm.CustomEditFormLayout = new AdvancedEditForm();
}
管理用户输入
禁用某些单元格
可以禁止用户根据条件编辑网格或列中的单元格值。
全局网格设置
- 禁用视图的选项OptionsBehavior.Editable 选项使所有单元格只读。
- 启用列的OptionsColumn.ReadOnly设置使其单元格为只读。
- 禁用列的OptionsColumn.AllowEdit和OptionsColumn。AllowFocus选项禁用其单元格。
根据条件禁用单元格
使用“ Disabled Cell Behavior”可以禁用行中满足特定条件的单元格。禁用的单元格显示为灰色,无法编辑。
处理ColumnView.ShowingEditor事件,并将其Cancel参数设置为true。
以下示例处理ShowingEditor事件,以在Country列中的值为“Germany”时禁用关注行中的单元格。
using DevExpress.XtraGrid.Views.Grid;
private void gridView1_ShowingEditor(object sender, System.ComponentModel.CancelEventArgs e) {
GridView view = sender as GridView;
string cellValue = view.GetRowCellValue(view.FocusedRowHandle, colCountry).ToString();
if (cellValue == "Germany")
e.Cancel = true;
}
以下示例阻止用户编辑奇数行中“ID”列中的单元格:
gridView.ShownEditor += (s, e) => {
GridView view = s as GridView;
view.ActiveEditor.Properties.ReadOnly =
gridView.FocusedColumn.FieldName == "ID" && gridView.FocusedRowHandle % 2 == 0;
};
禁用基于条件编辑表单字段
使用以下技术之一禁用“编辑表单”中的字段:
- 处理GridView.EditFormPrepared事件,使用e.BindableControls属性可以访问所需的编辑器并禁用其“可编辑”属性。
- 创建自定义编辑窗体并在EditFormUserControl中指定编辑器的行为