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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
RemovedItems
Elemente reflektiert, die Elemente aus der Auswahl entfernt, und nicht aus dem Netz.Griff die
PreviewKeyDown
Ereignis, und verwenden Sie dieSelectedItems
Eigenschaft zu löschen den ausgewählten Zeilen, die es gibt:InformationsquelleAutor der Antwort Inferis
Was sind Sie verbindlich Ihre DataGrid?
Im Idealfall sollten Sie reagieren, um das CollectionChanged events auf die Kollektion, die Sie verbindlich sind. So, Ihrer Logik (löschen entfernt Objekte) werden getrennt von der Benutzeroberfläche.
Können Sie bauen eine Observable-collection mit Ihren Objekten und binden Sie es an ItemsSource nur für diesen Zweck, wenn die ursprüngliche Erhebung nicht über die notwendigen Ereignisse.
Es möglicherweise nicht für Ihre spezielle Einstellung, aber das ist, wie ich das üblicherweise Tue.
InformationsquelleAutor der Antwort Denis Troller
XAML
Code hinter
InformationsquelleAutor der Antwort flux
Folgen Sie bitte den nachfolgenden code. Ich habe es mit folgenden code.
Bitte lassen Sie mich wissen, wenn änderungen erforderlich sind.
InformationsquelleAutor der Antwort Kiran Ch
Ein wenig spät, um der Partei, aber man Inferis Antwort arbeiten:
Diese behebt epalms Kommentar: "wenn Sie die Bearbeitung einer Zelle und verwenden Sie die entf-Taste zu entfernen, einige Zeichen in der Zelle werden Sie am Ende das löschen der gesamten Zeile"
InformationsquelleAutor der Antwort andy
Die Sie behandeln möchten das KeyUp oder KeyDown-Ereignis und lassen Sie die gedrückte Taste für Löschen.
InformationsquelleAutor der Antwort JaredPar