Qu'est-ce que le “appuyé sur la touche " supprimer” de l'événement pour le WPF Datagrid?
Je veux permettre à l'utilisateur de mettre en surbrillance une ligne sur le WPF DataGrid et appuyez sur la touche supprimer de pour supprimer la ligne.
- la fonctionnalité est déjà intégré dans l'INTERFACE utilisateur de la grille, donc, pour l'utilisateur, la ligne disparaît
- Je suis actuellement gérer cela sur le événement SelectionChanged (code ci-dessous)
- Je boucle à travers tous les "e.RemovedItems" et supprimez-les avec LINQ
Problème est: même lorsque vous simplement sélectionnez une ligne et de les déplacer hors de lui, le changement est tiré et que la ligne est dans e.RemovedItems (ce qui est étrange, pourquoi serait tout simplement de choisir quelque chose de la mettre dans un RemovedItems conteneur?).
Donc je suis à la recherche d'un DeleteKeyPressed événement afin que je puisse simplement le gérer. Qu'est-ce que cet événement appelé?
Je suis en utilisant le Mars 2009 à outils.
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;
}
}
RÉPONSE:
Grâce lnferis, c'est exactement ce que je cherchais, voici mon terminé de supprimer l'événement de gestion pour le contrôle datagrid, note l'événement KeyDown ne pas le feu pour une raison quelconque.
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");
}
- Le KeyDown ne devrait jamais arriver là parce que c'est déjà gestionnaire d'e.Manipulés = true) dans le précédent gestionnaire dans la bulle.
Vous devez vous connecter pour publier un commentaire.
La
RemovedItems
éléments reflète les éléments retirés de la sélection, et non pas de la grille.Poignée de la
PreviewKeyDown
de l'événement, et l'utilisation de laSelectedItems
propriété pour supprimer les lignes sélectionnées là:foreach
code à l'intérieur deif (grid.SelectedItems.Count > 0)
comme Edward Tanguay fait, alors tout devrait fonctionner. Mais merci pour ça!De quoi êtes-vous la liaison de votre contrôle DataGrid?
Idéalement, vous devriez réagir à CollectionChanged événements sur la collection vous lie. De cette façon, votre logique (suppression des éléments supprimés) sera séparé de votre INTERFACE utilisateur.
Vous pouvez construire une collection Observable contenant vos objets et le lier à ItemsSource juste à cet effet si la première collection ne pas avoir les événements.
Il pourrait ne pas convenir à votre installation spécifique, mais c'est la façon dont j'ai l'habitude de le faire.
XAML
Code derrière
Veuillez suivre le code ci-dessous. J'ai réussi avec le code ci-dessous.
S'il vous plaît laissez-moi savoir si des changements sont nécessaires.
Un peu en retard à la fête, mais pour obtenir des Inferis répondre de travail:
Cela résout epalms commentaire: "si vous êtes à l'édition d'une cellule et utilisez la touche supprimer pour supprimer certains caractères dans la cellule, vous finirez par la suppression de l'ensemble de la ligne"
Vous souhaitez gérer le KeyUp ou de l'événement KeyDown et cochez la Touche enfoncée pour Supprimer.