Quiero permitir que el usuario marque una fila en WPF DataGrid y presione la tecla de borrar para eliminar la fila.¿Qué es el evento "presionado la tecla borrar" para WPF Datagrid?
- la funcionalidad ya está integrado en la interfaz de usuario de la red, por lo que el usuario, la fila desaparece
- Actualmente me encargo de esto en el caso SelectionChanged (por debajo de código)
- bucle I a través de todos los "e.RemovedItems" y eliminarlos con LINQ
el problema es: incluso cuando simplemente se leccione una fila y salga de ella, se activa el cambio de selección y esa fila se encuentra en e.RemovedItems (lo cual es extraño, ¿por qué simplemente al seleccionar algo lo pondría en un contenedor RemovedItems?).
Así que estoy buscando un DeleteKeyPressed evento así que simplemente puedo manejarlo. ¿Cómo se llama ese evento?
Estoy utilizando el kit de herramientas de marzo de 2009.
XAML:
<Grid DockPanel.Dock="Bottom">
<toolkit:DataGrid x:Name="TheDataGrid"
SelectionChanged="TheDataGrid_SelectionChanged"
AutoGenerateColumns="True"
RowEditEnding="TheDataGrid_RowEditEnding"/>
de código subyacente:
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;
}
}
RESPUESTA:
Gracias lnferis, que era exactamente lo que estaba buscando, aquí es mi evento de manejo de eliminación final para la cuadrícula de datos, tenga en cuenta que el evento KeyDown no se dispara por alguna razón.
XAML:
<toolkit:DataGrid x:Name="TheDataGrid"
KeyDown="TheDataGrid_KeyDown"
PreviewKeyDown="TheDataGrid_PreviewKeyDown"
AutoGenerateColumns="True"
RowEditEnding="TheDataGrid_RowEditEnding"/>
de código subyacente
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");
}
KeyDown nunca debería llegar aquí porque ya es controlador (e.Handled = true) en el controlador anterior en la burbuja. – Shimmy