selecteditems personalizar ejemplo columns wpf datagrid

personalizar - wpf datagrid columns



¿Qué es el evento "presionado la tecla borrar" para WPF Datagrid? (6)

Quiero permitir que el usuario resalte una fila en WPF DataGrid y presione la tecla eliminar para eliminar la fila.

  • la funcionalidad ya está integrada en la interfaz de usuario de la grilla, por lo que para el usuario, la fila desaparece
  • Actualmente me encargo de esto en el evento SelectionChanged (código a continuación)
  • Reviso todos los "elementos removidos" y los elimino con LINQ

El problema es: incluso cuando simplemente selecciona una fila y se mueve fuera de ella, se activa el cambio de selección y esa fila está en e.RemovedItems (lo cual es extraño, ¿por qué simplemente seleccionar algo lo coloca en un contenedor RemovedItems?).

Así que estoy buscando un evento DeleteKeyPressed para poder manejarlo. ¿Cómo se llama ese evento?

Estoy usando 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"/>

código detrás:

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

RESPONDER:

Gracias lnferis, eso era exactamente lo que estaba buscando, aquí está 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"/>

código detrás

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


¿A qué vincula su DataGrid? Idealmente, debería reaccionar a los eventos CollectionChanged en la colección a la que se está vinculando. De esta forma, su lógica (eliminación de elementos eliminados) se separará de su UI.

Puede construir una colección Observable que contenga sus objetos y vincularla a ItemsSource solo para ese propósito si la colección original no tiene los eventos necesarios.

Puede que no se adapte a su configuración específica, pero así es como generalmente lo hago.


Desea manejar el evento KeyUp o KeyDown y marcar la tecla presionada para Eliminar.

private void OnKeyDown(object sender, KeyEventArgs e) { if ( Key.Delete == e.Key ) { // Delete pressed } }


Los elementos RemovedItems reflejan los elementos eliminados de la selección y no de la cuadrícula.

Maneje el evento PreviewKeyDown y use la propiedad SelectedItems para eliminar las filas seleccionadas allí:

private void PreviewKeyDownHandler(object sender, KeyEventArgs e) { var grid = (DataGrid)sender; if ( Key.Delete == e.Key ) { foreach (var row in grid.SelectedItems) { ... // perform linq stuff to delete here } } }


Por favor, siga el código a continuación. He tenido éxito con el siguiente código.

Por favor, avíseme si se requieren cambios.

private void grdEmployee_PreviewKeyDown(object sender, KeyEventArgs e) { if (e.Device.Target.GetType().Name == "DataGridCell") { if (e.Key == Key.Delete) { MessageBoxResult res = MessageBox.Show("Are you sure want to delete?", "Confirmation!", MessageBoxButton.YesNo,MessageBoxImage.Question); e.Handled = (res == MessageBoxResult.No); } } }


Un poco tarde para la fiesta, pero para que Inferis responda:

Dim isEditing = False AddHandler dg.BeginningEdit, Sub() isEditing = True AddHandler dg.RowEditEnding, Sub() isEditing = False AddHandler dg.PreviewKeyDown, Sub(obj, ev) If e.Key = Key.Delete AndAlso Not isEditing Then ...

Esto corrige el comentario de epalms: "si está editando una celda y usa la tecla eliminar para eliminar algunos caracteres de la celda, terminará borrando toda la fila"


XAML

<DataGrid ItemsSource="{Binding}" CommandManager.PreviewCanExecute="Grid_PreviewCanExecute" />

Código detrás

private void Grid_PreviewCanExecute(object sender, CanExecuteRoutedEventArgs e) { DataGrid grid = (DataGrid)sender; if (e.Command == DataGrid.DeleteCommand) { if (MessageBox.Show(String.Format("Would you like to delete {0}", (grid.SelectedItem as Person).FirstName), "Confirm Delete", MessageBoxButton.OKCancel) != MessageBoxResult.OK) e.Handled = true; } }