单击“删除”键按钮删除DataGrid行(WPF)

时间:2010-10-23 12:08:33

标签: c# wpf xaml datagrid keyboard

我有基于桌面的WPF 4应用程序。在这个应用程序的一个窗口中,我有DataGrid数据,与SQL Server数据库绑定(通过ADO.NET实体框架)。为了操作数据,我有一个删除按钮,删除DataGrid中选定的行并调用SaveChanges()方法。

现在我想添加对键盘操作的支持,例如我想让用户通过选择并单击删除键盘按钮来删除该行。

如果我在窗口XAML中设置CanUserDeleteRows="True",它会删除所选行,但不会提交数据库,换句话说,它不会调用SaveChanges()方法。

我尝试将keyDown事件处理程序添加到DataGrid检查if (e.Key == Key.Delete),因此请运行remove方法删除所选行并调用SaveChanges()方法,但它不会工作

我的问题是如何向DataGrid添加键盘事件处理程序,以便删除所选行并调用SaveChanges()方法或只运行我自己的方法,该方法处理从{{1}删除行并提交DB。

当然,如果您对我的问题有任何其他想法,请随时提出建议。

4 个答案:

答案 0 :(得分:8)

您是否尝试过使用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...
        //...
    }
}

答案 1 :(得分:2)

或者您可以使用CommandManager,如果选择了行,则只删除该行(如果单元格正在编辑,则会备份)。

将它放在Datagrid所在的窗口中。

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

答案 2 :(得分:2)

与Ben相同,但所有人必须做的是通过将属性设置为true来启用属性CanUserDeleteRows,并且删除按钮将激活删除。

XAML的{​​{1}}所示:

DataGrid

答案 3 :(得分:0)

我看到你成功了,但是对于在搜索结果中发表这篇文章的其他人来说,这可能会有用。 您需要覆盖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
    }
}

但这仅仅是为了操纵纯图形。要保存到数据库或其他操作,请使用数据网格的数据源。