Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DataGridView.Editmode=Editonner。如何选择要删除的行?_C#_.net_Vb.net_Datagridview - Fatal编程技术网

C# DataGridView.Editmode=Editonner。如何选择要删除的行?

C# DataGridView.Editmode=Editonner。如何选择要删除的行?,c#,.net,vb.net,datagridview,C#,.net,Vb.net,Datagridview,当我使用EditMode=editonener时,当我选择行时,单元格将进入EditMode 用户很难选择行选择器来删除行 你知道什么诀窍吗?你应该明白,当进入编辑模式时,你的程序不能真正理解用户的想法,但当不进入编辑模式时 用户可以按Escape键取消编辑模式,然后可以删除行。此外,您还可以选择其他DataGridViewEditMode(请参阅),例如DataGridViewEditMode.EditOnKeystroke或EditOnKeystrokeOrF2,从可用性角度来看,这两种模式

当我使用EditMode=editonener时,当我选择行时,单元格将进入EditMode

用户很难选择行选择器来删除行


你知道什么诀窍吗?

你应该明白,当进入编辑模式时,你的程序不能真正理解用户的想法,但当不进入编辑模式时

用户可以按Escape键取消编辑模式,然后可以删除行。此外,您还可以选择其他DataGridViewEditMode(请参阅),例如DataGridViewEditMode.EditOnKeystroke或EditOnKeystrokeOrF2,从可用性角度来看,这两种模式都很好。

我尝试了以下技巧:

如果用户单击行标题,请将编辑模式更改为
EditOnKeystrokeOrF2
,然后结束编辑

如果用户单击其他位置,请将编辑模式更改为
editonener
,然后开始编辑


Private子dgv2_CellClick(ByVal sender作为对象,ByVal e作为System.Windows.Forms.DataGridViewCellEventArgs)处理dgv2.CellClick
如果e.ColumnIndex=-1,则
dgv2.EditMode=DataGridViewEditMode.EditOnKeystrokeOrF2
dgv2.EndEdit()
ElseIf dgv2.EditMode数据网格视图EditMode.editOnter然后
dgv2.EditMode=DataGridViewEditMode.Editonner
dgv2.BeginEdit(错误)
如果结束
端接头

这确实需要在鼠标向下移动时完成。鼠标点击时触发单元格点击事件:

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
Private子产品grid\u MouseDown(发送方作为对象,e作为MouseEventArgs)处理产品grid.MouseDown
Dim grid=DirectCast(发送方,DataGridView)
尺寸信息=网格高度测试(e.X,e.Y)
如果into.Type=DataGridViewHitTestType.RowHeader或LSE info.Type=DataGridViewHitTestType.TopLeftHeader,则
grid.EditMode=DataGridViewEditMode.EditOnKeystrokeOrF2
grid.EndEdit()
ElseIf grid.EditMode DataGridViewEditMode.Editonner然后
grid.EditMode=DataGridViewEditMode.Editonner
如果结束
端接头

还需要做更多的工作,包括处理Tab键行为。此类行为(以及上述修改)最好在继承DataGridView的用户控件中完成。

您可以将焦点更改为父控件。这将迫使单元格结束编辑,而无需更改模式本身

例如,如果选择多个单元格,此代码段将离开编辑模式

protected override void OnSelectionChanged(EventArgs e)
{
    base.OnSelectionChanged(e);

    if (SelectedCells.Count > 1)
    {
        // leave edit mode
        Parent?.Focus();
    }
}

我知道所有其他模式。用户喜欢Excel模式。我仅在频繁使用的DGV上使用Editonner。我知道如何删除一行,但指导每个用户此行为。。。。Esc键可以取消编辑,但在此模式下,重新进入编辑模式。我不明白为什么选择行选择器,不结束编辑模式。解决方案是将光标移动到不可编辑的单元格。这非常有用,我将其与“CellPreviewKeyDown”事件相结合,允许按ESC键离开单元格编辑模式。我也发现这很有用,但如果有一个单元格已经处于编辑模式,并且我选择了多行要删除,它会将其中一行保留在编辑模式下,所以删除不再有效。然后我将此代码移动到
CellMouseUp
事件中,它正是我想要的工作方式。谢谢你!
protected override void OnSelectionChanged(EventArgs e)
{
    base.OnSelectionChanged(e);

    if (SelectedCells.Count > 1)
    {
        // leave edit mode
        Parent?.Focus();
    }
}