通过单击Delete键按钮删除DataGrid行(WPF)

4smxwvx5  于 2022-11-26  发布在  其他
关注(0)|答案(4)|浏览(344)

我有一个基于WPF 4桌面的应用程序。在这个应用程序的一个窗口中,我有一个带有数据的DataGrid,它与SQL Server数据库绑定(通过ADO.NET实体框架)。为了操作数据,我有一个删除按钮,它从DataGrid中删除选定的行,并调用SaveChanges()方法。
现在我想添加对键盘操作的支持,例如,我想让用户通过选择并单击Delete keyboard按钮来删除该行。
如果我在XAML窗口中设置CanUserDeleteRows="True",它会删除选定行,但不会提交到数据库,换句话说,它不会调用SaveChanges()方法。
我尝试将keyDown事件处理程序添加到DataGrid,检查if (e.Key == Key.Delete),因此运行删除选定行的remove方法并调用SaveChanges()方法,但它不起作用。
如何将键盘事件处理程序添加到DataGrid
目的是能够删除所选行并调用SaveChanges()方法或仅运行我自己的方法,该方法处理从DataGrid中删除行并提交到DB。
当然,如果你有什么别的想法,跟我的问题有关,随时提出来。

lnvxswe2

lnvxswe21#

您尝试过PreviewKeyDown事件吗?类似于以下内容

<DataGrid x:Name="dataGrid" PreviewKeyDown="dataGrid_PreviewKeyDown">

private void dataGrid_PreviewKeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Delete)
    {
        var dataGrid = (DataGrid)sender;
        // dataGrid.SelectedItems will be deleted...
        //...
    }
}
dced5bon

dced5bon2#

或者,您可以使用CommandManager,它仅在选定行时删除该行(如果单元格正在编辑,则会备份)。
将其放在Datagrid所在的窗口中。

CommandManager.RegisterClassInputBinding(typeof(DataGrid),
                new InputBinding(DataGrid.DeleteCommand, new KeyGesture(Key.Delete)));
6rqinv9w

6rqinv9w3#

与Ben的方法相同,但只需将CanUserDeleteRows属性设置为true以启用该属性,删除按钮将激活删除。
如下图XAMLDataGrid

CanUserDeleteRows="True"
muk1a3rh

muk1a3rh4#

我看到您设法继续,但这可能对在搜索结果中看到此帖子的其他人有用。您需要重写DataGrid的OnCanExecuteDelete方法,如下所示:

public class MyDataGrid : DataGrid
{
    protected override void OnCanExecuteDelete(CanExecuteRoutedEventArgs e)
    {
        foreach(DataRowView _row in this.SelectedItems) //assuming the grid is multiselect
        {
            //do some actions with the data that will be deleted
        }
        e.CanExecute = true; //tell the grid data can be deleted
    }
}

但这只是用于操作纯图形。对于保存到数据库或其他操作,请使用数据网格的数据源。

相关问题