Удалить строку DataGrid (WPF), нажав кнопку «Удалить ключ» - PullRequest
4 голосов
/ 23 октября 2010

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

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

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

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

У меня вопрос, как я могу добавить обработчик событий клавиатуры в DataGrid, который позволит удалить выбранную строку и вызвать метод SaveChanges() или просто запустить мой собственный метод, который занимается удалением строки из DataGrid и делает коммит в БД .

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

Ответы [ 4 ]

8 голосов
/ 23 октября 2010

Вы пробовали с событием 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 голосов
/ 05 октября 2013

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

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

CanUserDeleteRows="True"
2 голосов
/ 15 марта 2012

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

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

CommandManager.RegisterClassInputBinding(typeof(DataGrid),
                new InputBinding(DataGrid.DeleteCommand, new KeyGesture(Key.Delete)));
0 голосов
/ 06 марта 2014

Я вижу, вам удалось продвинуться вперед, но, возможно, это будет полезно для других, увидевших этот пост в результатах поиска.Вам необходимо переопределить метод 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
    }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...