43 Stimmen

Was ist das "die Löschtaste gedrückt" Ereignis für die WPF Datagrid?

Ich möchte dem Benutzer ermöglichen Markieren Sie eine Zeile im WPF DataGrid und drücken Sie die Entf-Taste um die Zeile zu löschen.

  • die Funktionalität ist bereits in die Benutzeroberfläche integriert des Gitters, so dass die Zeile für den Benutzer nicht mehr sichtbar ist.
  • Ich behandle dies derzeit auf der Ereignis SelectionChanged (Code unten)
  • Ich durchlaufe alle "e.RemovedItems" und lösche sie mit LINQ

Das Problem ist: auch wenn Sie einfach Wählen Sie Wenn Sie eine Zeile auswählen und sich von ihr wegbewegen, wird die Auswahländerung ausgelöst, und die Zeile befindet sich in e.RemovedItems (was seltsam ist, denn warum sollte eine einfache Auswahl etwas in einen RemovedItems-Container bringen?).

Ich suche also nach einem DeleteKeyPressed Ereignis, damit ich es einfach behandeln kann. Wie wird dieses Ereignis genannt?

Ich verwende 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:

Danke lnferis, das war genau das, was ich gesucht habe, hier ist meine fertige löschen Behandlung Ereignis für die Datentabelle, beachten Sie die KeyDown-Ereignis nicht aus irgendeinem Grund Feuer.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X