Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the "pressed the delete key" event for the WPF Datagrid?

Tags:

wpf

datagrid

I want to enable the user to highlight a row on the WPF DataGrid and press delete key to delete the row.

  • 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

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?).

So I am looking for a DeleteKeyPressed event so I can simply handle it. What is that event called?

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"/> 

code-behind:

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;     } } 

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"/> 

code-behind

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"); } 
like image 613
Edward Tanguay Avatar asked Mar 24 '09 13:03

Edward Tanguay


1 Answers

The RemovedItems items reflects the items removed from the selection, and not from the grid.

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         }     } } 
like image 180
Inferis Avatar answered Sep 23 '22 02:09

Inferis