什么是“按下了删除键"?WPF Datagrid 的事件? [英] What is the "pressed the delete key" event for the WPF Datagrid?
问题描述
我想让用户突出显示 WPF DataGrid 上的一行,然后按删除键删除该行.
- 该功能已经内置到网格的 UI 中,因此对于用户而言,该行消失了
- 我目前在 SelectionChanged 事件(下面的代码)上处理此问题
- 我遍历所有e.RemovedItems"并使用 LINQ 删除它们
- the functionality is already built into the UI of the grid, so to the user, the row disappears
- I currently handle this on the SelectionChanged event (code below)
- I loop through all the "e.RemovedItems" and delete them with LINQ
问题是:即使您只是选择一行并移开它,也会触发选择更改并且该行在 e.RemovedItems 中(这很奇怪,为什么要简单地选择一些东西把它放在一个 RemovedItems 容器中?).
Problem is: even when you simply select a row and move off of it, selection change is fired and that row is in e.RemovedItems (which is odd, why would simply selecting something put it in a RemovedItems container?).
所以我正在寻找 DeleteKeyPressed 事件,以便我可以简单地处理它.那个事件叫什么?
So I am looking for a DeleteKeyPressed event so I can simply handle it. What is that event called?
我使用的是 2009 年 3 月的工具包.
I am using the March 2009 toolkit.
XAML:
<Grid DockPanel.Dock="Bottom">
<toolkit:DataGrid x:Name="TheDataGrid"
SelectionChanged="TheDataGrid_SelectionChanged"
AutoGenerateColumns="True"
RowEditEnding="TheDataGrid_RowEditEnding"/>
代码隐藏:
private void TheDataGrid_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
{
if (e.RemovedItems.Count > 0)
{
Message.Text = "The following were removed: ";
foreach (object obj in e.RemovedItems)
{
Customer customer = obj as Customer;
Message.Text += customer.ContactName + ",";
_db.Order_Details.DeleteAllOnSubmit(
customer.Orders.SelectMany(o => o.Order_Details));
_db.Orders.DeleteAllOnSubmit(customer.Orders);
_db.Customers.DeleteOnSubmit(customer);
}
}
try
{
_db.SubmitChanges();
}
catch (Exception ex)
{
Message.Text = ex.Message;
}
}
答案:
谢谢 lnferis,这正是我要找的,这是我完成的数据网格删除处理事件,注意 KeyDown 事件由于某种原因没有触发.
ANSWER:
Thanks lnferis, that was exactly what I was looking for, here is my finished delete handling event for the datagrid, note the KeyDown event doesn't fire for some reason.
XAML:
<toolkit:DataGrid x:Name="TheDataGrid"
KeyDown="TheDataGrid_KeyDown"
PreviewKeyDown="TheDataGrid_PreviewKeyDown"
AutoGenerateColumns="True"
RowEditEnding="TheDataGrid_RowEditEnding"/>
代码隐藏
private void TheDataGrid_PreviewKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Delete)
{
var grid = (DataGrid)sender;
if (grid.SelectedItems.Count > 0)
{
string checkMessage = "The following will be removed: ";
foreach (var row in grid.SelectedItems)
{
Customer customer = row as Customer;
checkMessage += customer.ContactName + ",";
}
checkMessage = Regex.Replace(checkMessage, ",$", "");
var result = MessageBox.Show(checkMessage, "Delete", MessageBoxButton.OKCancel);
if (result == MessageBoxResult.OK)
{
foreach (var row in grid.SelectedItems)
{
Customer customer = row as Customer;
_db.Order_Details.DeleteAllOnSubmit(
customer.Orders.SelectMany(o => o.Order_Details));
_db.Orders.DeleteAllOnSubmit(customer.Orders);
_db.Customers.DeleteOnSubmit(customer);
}
_db.SubmitChanges();
}
else
{
foreach (var row in grid.SelectedItems)
{
Customer customer = row as Customer;
LoadData();
_db.Refresh(System.Data.Linq.RefreshMode.OverwriteCurrentValues, customer); //TODO: this doesn't refresh the datagrid like the other instance in this code
}
}
}
}
}
private void TheDataGrid_KeyDown(object sender, KeyEventArgs e)
{
Console.WriteLine("never gets here for some reason");
}
推荐答案
RemovedItems
项目反映了从选择中移除的项目,而不是从网格中移除的项目.
The RemovedItems
items reflects the items removed from the selection, and not from the grid.
处理 PreviewKeyDown
事件,并使用 SelectedItems
属性删除那里的选定行:
Handle the PreviewKeyDown
event, and use the SelectedItems
property to delete the selected rows there:
private void PreviewKeyDownHandler(object sender, KeyEventArgs e) {
var grid = (DataGrid)sender;
if ( Key.Delete == e.Key ) {
foreach (var row in grid.SelectedItems) {
... // perform linq stuff to delete here
}
}
}
这篇关于什么是“按下了删除键"?WPF Datagrid 的事件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!