Ich möchte den Benutzer aktivieren markieren Sie eine Zeile auf dem WPF DataGrid und drücken Sie die Löschtaste, um die Zeile zu löschen.Was ist das Ereignis "delete key gedrückt" für das WPF DataGrid?
- Die Funktionalität ist bereits in die UI gebaut des Gitters, also dem Benutzer, die Zeile verschwindet
- I handhaben diese aktuell den Selection Ereignis (Code unten)
- I loop durch alle "e.RemovedItems" und löschen Sie sie mit LINQ
Problem ist: auch wenn Sie einfach se lect eine Zeile und bewegen Sie sich davon weg, Auswahl Änderung ausgelöst wird und diese Zeile ist in e.RemovedItems (was ist seltsam, warum würde einfach etwas auswählen es in einem RemovedItems-Container?).
So suche ich nach einem DeleteKeyPressed Ereignis, damit ich einfach damit umgehen kann. Wie heißt dieses Ereignis?
Ich benutze das Toolkit vom März 2009.
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;
}
}
ANTWORT:
Dank lnferis, das war genau das, was ich suchte, hier ist mein fertig gelöschtes Ereignis Beachten Sie, dass das KeyDown-Ereignis für das Datagrid aus irgendeinem Grund nicht ausgelöst wird.
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");
}
Die KeyDown sollte nie hier ankommen, weil es bereits Handler ist (e.Handled = true) in der vorherigen Handler in der Blase. – Shimmy