【发布时间】:2010-07-08 19:56:18
【问题描述】:
当我使用 EditMode = EditOnEnter 时,当我选择行时,单元格进入编辑模式。
用户很难选择行选择器来删除行。
你知道什么技巧吗?
【问题讨论】:
标签: c# .net vb.net datagridview
当我使用 EditMode = EditOnEnter 时,当我选择行时,单元格进入编辑模式。
用户很难选择行选择器来删除行。
你知道什么技巧吗?
【问题讨论】:
标签: c# .net vb.net datagridview
我试试这个技巧:
如果用户单击行标题,请将 EditMode 更改为 EditOnKeystrokeOrF2 并结束编辑。
如果用户单击其他位置,请将 EditMode 更改为 EditOnEnter并开始编辑。
Private Sub dgv2_CellClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgv2.CellClick
If e.ColumnIndex = -1 Then
dgv2.EditMode = DataGridViewEditMode.EditOnKeystrokeOrF2
dgv2.EndEdit()
ElseIf dgv2.EditMode <> DataGridViewEditMode.EditOnEnter Then
dgv2.EditMode = DataGridViewEditMode.EditOnEnter
dgv2.BeginEdit(False)
End If
End Sub
【讨论】:
CellMouseUp 事件,它按我想要的方式工作。谢谢!
你应该明白你的程序不能真正读懂用户的想法,并理解什么时候进入编辑模式,但什么时候不这样。
用户可以按Escape键取消编辑模式,然后可以删除行。您也可以选择其他 DataGridViewEditMode(参见 http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridvieweditmode.aspx),例如 DataGridViewEditMode.EditOnKeystroke 或 EditOnKeystrokeOrF2,从可用性的角度来看,它们都很好。
【讨论】:
这确实需要在 MouseDown 上完成。在 MouseUp 上触发单元格点击事件:
Private Sub ProductsGrid_MouseDown(sender As Object, e As MouseEventArgs) Handles ProductsGrid.MouseDown
Dim grid = DirectCast(sender, DataGridView)
Dim info = grid.HitTest(e.X, e.Y)
If into.Type = DataGridViewHitTestType.RowHeader OrElse info.Type = DataGridViewHitTestType.TopLeftHeader Then
grid.EditMode = DataGridViewEditMode.EditOnKeystrokeOrF2
grid.EndEdit()
ElseIf grid.EditMode <> DataGridViewEditMode.EditOnEnter Then
grid.EditMode = DataGridViewEditMode.EditOnEnter
End If
End Sub
还有更多工作要做,包括处理 Tab 键行为。这种行为(以及上述修改)可能最好在继承 DataGridView 的用户控件中完成。
【讨论】:
您可以将焦点更改为父控件。这将强制单元格结束编辑,而无需更改模式本身。
例如,如果您选择多个单元格,此 sn-p 将退出编辑模式。
protected override void OnSelectionChanged(EventArgs e)
{
base.OnSelectionChanged(e);
if (SelectedCells.Count > 1)
{
// leave edit mode
Parent?.Focus();
}
}
【讨论】: