Was ist das Ereignis "delete key" für das WPF Datagrid gedrückt?

Möchte ich dem Benutzer ermöglichen, die markieren Sie eine Zeile auf der WPF-DataGrid und drücken die entf-Taste löschen Sie die Zeile.

  • die Funktionalität ist bereits gebaut in den UI - des Gitters, so dass der Benutzer die Zeile verschwindet
  • Ich derzeit handle diese auf dem SelectionChanged-Ereignis (code unten)
  • Ich eine Schleife durch alle "e.RemovedItems" und löschen Sie Sie mit LINQ

Problem ist:auch wenn Sie einfach wählen Sie einer Reihe und bewegen sich von ihm Weg -, Auswahl-ändern wird ausgelöst, und die Zeile wird in e.RemovedItems (das ist seltsam, warum würde einfach die Auswahl etwas, das es in einem RemovedItems container?).

So, ich bin auf der Suche nach einem DeleteKeyPressed Ereignis, so kann ich das einfach umgehen. Was ist das Ereignis genannt?

Bin ich mit der März 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;
    }
}

ANTWORT:

Dank lnferis, das war genau was ich suchte, hier ist meine fertige löschen handling-Ereignis für das Steuerelement beachten Sie das KeyDown-Ereignis nicht ausgelöst für einige Grund.

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

InformationsquelleAutor der Frage Edward Tanguay | 2009-03-24

Schreibe einen Kommentar