DataGridView 控件的默认键盘和鼠标行为
下表介绍用户如何通过键盘和鼠标与 DataGridView 控件进行交互。
注意
若要自定义键盘行为,可以处理标准键盘事件,例如 KeyDown。 但是,在编辑模式下,托管的编辑控件接收键盘输入,DataGridView 控件不会发生键盘事件。 若要处理编辑控件事件,请将处理程序附加到 EditingControlShowing 事件处理程序中的编辑控件。 或者,可以通过替代 ProcessDialogKey 和 ProcessDataGridViewKey 方法来自定义 DataGridView 子类中的键盘行为。
默认键盘处理
基本导航和输入键
键或组合键 | 说明 |
---|---|
向下键 | 将焦点移至当前单元格正下方的单元格。 如果焦点在最后一行,则不执行任何操作。 |
向左键 | 将焦点移至行中的上一个单元格。 如果焦点位于行中的第一个单元格,则不执行任何操作。 |
向右键 | 将焦点移至行中的下一个单元格。 如果焦点位于行中的最后一个单元格,则不执行任何操作。 |
向上键 | 将焦点移至当前单元格正上方的单元格。 如果焦点在第一行,则不执行任何操作。 |
主页 | 将焦点移至当前行中的第一个单元格。 |
End | 将焦点移至当前行中的最后一个单元格。 |
Page Down | 按完全显示的行数向下滚动控件。 在不更改列的情况下,将焦点移至最后一个完全显示的行。 |
Page Up | 按完全显示的行数向上滚动控件。 在不更改列的情况下,将焦点移至显示的第一行。 |
Tab | 如果 StandardTab 属性值为 false ,则将焦点移至当前行中的下一个单元格。 如果焦点已经位于该行的最后一个单元格,则将焦点移至下一行的第一个单元格。 如果焦点位于控件中的最后一个单元格,则将焦点移至父容器的 Tab 键顺序中的下一个控件。如果 StandardTab 属性值为 true ,则将焦点移至父容器的 Tab 键顺序中的下一个控件。 |
Shift + Tab | 如果 StandardTab 属性值为 false ,则将焦点移至当前行中的上一个单元格。 如果焦点已经位于该行的第一个单元格,则将焦点移至上一行的最后一个单元格。 如果焦点位于控件中的第一个单元格,则将焦点移至父容器的 Tab 键顺序中的上一个控件。如果 StandardTab 属性值为 true ,则将焦点移至父容器的 Tab 键顺序中的上一个控件。 |
Ctrl + Tab | 如果 StandardTab 属性值为 false ,则将焦点移至父容器的 Tab 键顺序中的下一个控件。如果 StandardTab 属性值为 true ,则将焦点移至当前行中的下一个单元格。 如果焦点已经位于该行的最后一个单元格,则将焦点移至下一行的第一个单元格。 如果焦点位于控件中的最后一个单元格,则将焦点移至父容器的 Tab 键顺序中的下一个控件。 |
Ctrl + Shift + Tab | 如果 StandardTab 属性值为 false ,则将焦点移至父容器的 Tab 键顺序中的上一个控件。如果 StandardTab 属性值为 true ,则将焦点移至当前行中的上一个单元格。 如果焦点已经位于该行的第一个单元格,则将焦点移至上一行的最后一个单元格。 如果焦点位于控件中的第一个单元格,则将焦点移至父容器的 Tab 键顺序中的上一个控件。 |
Ctrl + 箭头键 | 沿箭头方向将焦点移至最远的单元格。 |
Ctrl + Home | 将焦点移至控件中的第一个单元格。 |
Ctrl + End | 将焦点移至控件中的最后一个单元格。 |
Ctrl + Page Down/Up | 与 Page Down 或 Page Up 相同。 |
F2 | 如果 EditMode 属性值为 EditOnF2 或 EditOnKeystrokeOrF2,则将当前单元格置于单元格编辑模式。 |
F3 | 如果 DataGridViewColumn.SortMode 属性值为 Automatic,则对当前列进行排序。 它与单击当前列标题相同。 自 .NET Framework 4.7.2 起可用。 若要启用此功能,应用程序必须以 .NET Framework 4.7.2 或更高版本为目标,或者使用 AppContext 开关显式选择进行辅助功能改进。 |
F4 | 如果当前单元格是 DataGridViewComboBoxCell,则将该单元格置于编辑模式并显示下拉列表。 |
Alt + 向上键/向下键 | 如果当前单元格是 DataGridViewComboBoxCell,则将该单元格置于编辑模式并显示下拉列表。 |
Alt + 向左键/向右键 | 增加或减少当前单元格的列宽。 |
Space | 如果当前单元格是 DataGridViewButtonCell、DataGridViewLinkCell 或 DataGridViewCheckBoxCell,则引发 CellClick 和 CellContentClick 事件。 如果当前单元格是 DataGridViewButtonCell,则同时按下按钮。 如果当前单元格是 DataGridViewCheckBoxCell,则同时更改复选状态。 |
Enter | 提交对当前单元格和行的任何更改,并将焦点移至当前单元格正下方的单元格。 如果焦点在最后一行,则在不移动焦点的情况下提交所有更改。 |
Esc | 如果控件处于编辑模式,则取消编辑。 如果控件不处于编辑模式,并且控件绑定到支持编辑的数据源或者已通过行级提交范围实现虚拟模式,则恢复对当前行所做的任何更改。 |
Backspace | 在编辑单元格时删除插入点之前的字符。 |
Delete | 在编辑单元格时删除插入点之后的字符。 |
Ctrl + Enter | 在不移动焦点的情况下,提交对当前单元格所做的任何更改。 如果控件绑定到支持编辑的数据源,或者已通过行级提交范围实现虚拟模式,则同时提交对当前行所做的任何更改。 |
Ctrl + 0 | 如果可以编辑当前单元格,则在该单元格中输入 DBNull.Value 值。 默认情况下,DBNull 单元格值的显示值是对当前单元格有效的 DataGridViewCellStyle 的 NullValue 属性值。 |
选择键
如果将 MultiSelect 属性设置为 false
,将 SelectionMode 属性设置为 CellSelect,则使用导航键更改当前单元格会将所选内容更改为新单元格。 Shift、Ctrl 和 Alt 键不会影响此行为。
如果将 SelectionMode 设置为 RowHeaderSelect 或 ColumnHeaderSelect,则会发生相同的行为,但添加以下操作。
键或组合键 | 说明 |
---|---|
Shift + 空格键 | 选择整行或整列(与单击行或列标题相同)。 |
导航键(箭头键、Page Up/Down、Home、End) | 如果选择了整行或整列,将当前单元格更改为新行或新列会将所选内容移至新的整行或整列(取决于选择模式)。 |
如果将 MultiSelect 设置为 false
,将 SelectionMode 设置为 FullRowSelect 或 FullColumnSelect,则使用键盘将当前单元格更改为新行或新列会将所选内容移至新的整行或整列。 Shift、Ctrl 和 Alt 键不会影响此行为。
如果将 MultiSelect 设置为 true
,导航行为不会改变,但在按下 Shift(包括 Ctrl + Shift)的同时使用键盘导航将修改多单元格选择。 在导航开始之前,控件将当前单元格标记为定位单元格。 如果在按下 Shift 的同时进行导航,所选内容将包括定位单元格和当前单元格之间的所有单元格。 如果控件中的其他单元格已被选中,它们将保持选中状态,但如果键盘导航暂时将它们置于定位单元格和当前单元格之间,它们可能会变为未选中状态。
如果将 MultiSelect 设置为 true
,将 SelectionMode 设置为 FullRowSelect 或 FullColumnSelect,则定位单元格和当前单元格的行为相同,只有整行或整列变为选中或未选中状态。
默认鼠标处理
基本鼠标处理
注意
用鼠标左键单击单元格始终会更改当前单元格。 用鼠标右键单击单元格会打开快捷菜单(如果有)。
鼠标操作 | 说明 |
---|---|
鼠标左键按下 | 使被单击的单元格成为当前单元格,并引发 DataGridView.CellMouseDown 事件。 |
鼠标左键松开 | 引发 DataGridView.CellMouseUp 事件 |
鼠标左键单击 | 引发 DataGridView.CellClick 和 DataGridView.CellMouseClick 事件 |
按下鼠标左键,并在列标题单元格上拖动 | 如果 DataGridView.AllowUserToOrderColumns 属性为 true ,则移动列,以便将其放入新位置。 |
鼠标选择
没有与鼠标中键或鼠标滚轮相关联的选择行为。
如果将 MultiSelect 属性设置为 false
,将 SelectionMode 属性设置为 CellSelect,则会发生以下行为。
鼠标操作 | 说明 |
---|---|
单击 | 如果用户单击单元格,则仅选择当前单元格。 如果用户单击行或列标题,则没有选择行为。 |
右键单击 | 如果有快捷菜单,则显示快捷菜单。 |
当 SelectionMode 设置为 RowHeaderSelect 或 ColumnHeaderSelect 时会发生相同的行为,只不过,根据选择模式,单击行或列标题将选择整行或整列并将当前单元格设置为行或列中的第一个单元格。
如果 SelectionMode 设置为 FullRowSelect 或 FullColumnSelect,单击行或列中的任何单元格都会选择整行或整列。
如果 MultiSelect 设置为 true
,在按下 Ctrl 或 Shift 的同时单击单元格将修改多单元格选择。
如果在按下 Ctrl 的同时单击单元格,该单元格将更改其选择状态,而所有其他单元格保持其当前选择状态。
如果在按下 Shift 的同时单击一个单元格或一系列单元格,所选内容包括当前单元格和第一次单击前位于当前单元格位置的定位单元格之间的所有单元格。 如果跨多个单元格单击并拖动指针,定位单元格则为拖动操作开始时单击的单元格。 按下 Shift 时的后续单击会更改当前单元格,但不会更改定位单元格。 如果控件中的其他单元格已被选中,它们将保持选中状态,但如果鼠标导航暂时将它们置于定位单元格和当前单元格之间,它们可能会变为未选中状态。
如果将 MultiSelect 设置为 true
,将 SelectionMode 设置为 RowHeaderSelect 或 ColumnHeaderSelect,则在按下 Shift 的同时单击行或列标题(取决于选择模式)会修改现在选择的整行或整列(如果存在此类选择)。 否则,它会清除所选内容并开始新的整行或整列选择。 但是,在按下 Ctrl 的同时单击行或列标题会在当前选择中添加或删除单击的行或列,而不会以其他方式修改当前选择。
如果将 MultiSelect 设置为 true
,将 SelectionMode 设置为 FullRowSelect 或 FullColumnSelect,则在按下 Shift 或 Ctrl 的同时单击单元格的行为是一样的,只不过只有整行和整列受影响。
另请参阅
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈