2010-10-23 4 views
4

У меня есть настольное приложение WPF 4. В одном из окон этого приложения у меня есть DataGrid с данными, связанными с базой данных SQL Server (через ADO.NET Entity Framework). Для управления данными у меня есть кнопка удаления, которая удаляет выбранную строку из DataGrid и вызывает метод SaveChanges().Удалить строку DataGrid (WPF), нажав кнопку «Удалить ключ»

Теперь я хочу добавить поддержку манипуляций с клавиатурой, например. Я хочу, чтобы пользователь удалил строку, выбрав и нажав кнопку «Удалить клавиатуру».

Если я установил CanUserDeleteRows="True" в XAML окна, он удаляет выбранную строку, но не делает фиксацию для базы данных, другими словами, она не вызывает метод SaveChanges().

Я попытался добавить обработчик событий KeyDown в DataGrid, чтобы проверить if (e.Key == Key.Delete), поэтому запустите метод удаления, который удаляет выбранную строку и вызывает метод SaveChanges(), но он не работает.

Мой вопрос: как добавить элемент управления событиями в DataGrid, который позволит удалить выбранную строку и вызвать метод SaveChanges() или просто запустить мой собственный метод, который имеет дело с удалением строки из DataGrid и сделать фиксацию в DB.

Конечно, если у вас есть какая-либо другая идея, связанная с моим вопросом, не стесняйтесь предлагать.

Спасибо.

ответ

8

Вы пытались с событием PreviewKeyDown? Что-то вроде этого

<DataGrid x:Name="dataGrid" PreviewKeyDown="dataGrid_PreviewKeyDown"> 

private void dataGrid_PreviewKeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.Key == Key.Delete) 
    { 
     var dataGrid = (DataGrid)sender; 
     // dataGrid.SelectedItems will be deleted... 
     //... 
    } 
} 
2

Или вы могли бы использовать CommandManager, который только удаляет строку, если выбрана строка (если ячейка редактируется, он поддерживает).

Поместите это в свое окно, где находится Datagrid.

CommandManager.RegisterClassInputBinding(typeof(DataGrid), 
       new InputBinding(DataGrid.DeleteCommand, new KeyGesture(Key.Delete))); 
+0

Это не делает ничего. Где это должно быть, в конструкторе окна? Или в Loaded handler? – Soonts

+0

Он должен быть расположен в конструкторе окон –

2

То же, что Бен, но все, что нужно сделать, это включить свойство CanUserDeleteRows, установив его в true и кнопка удаления будет удалить активный.

Как показано ниже в XAML для DataGrid:

CanUserDeleteRows="True" 
0

Я вижу, вам удалось идти вперед, но, возможно, это будет полезно для других Seing этот пост в результатах поиска. Вы должны переопределить OnCanExecuteDelete метода DataGrid, как:

public class MyDataGrid : DataGrid 
{ 
    protected override void OnCanExecuteDelete(CanExecuteRoutedEventArgs e) 
    { 
     foreach(DataRowView _row in this.SelectedItems) //assuming the grid is multiselect 
     { 
      //do some actions with the data that will be deleted 
     } 
     e.CanExecute = true; //tell the grid data can be deleted 
    } 
} 

Но это только для манипулирования чистой графики. Для сохранения в базе данных или других действий используйте источник данных вашей сетки данных.

Смежные вопросы