我有基于桌面的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。
当然,如果您对我的问题有任何其他想法,请随时提出建议。
答案 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)
答案 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
}
}
但这仅仅是为了操纵纯图形。要保存到数据库或其他操作,请使用数据网格的数据源。