Что такое событие «нажата клавиша удаления» для таблицы данных WPF? - PullRequest
36 голосов
/ 24 марта 2009

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

  • функциональность уже встроена в пользовательский интерфейс сетки, поэтому для пользователя строка исчезает
  • В настоящее время я обрабатываю это для события SelectionChanged (код ниже)
  • Я перебираю все "e.RemovedItems" и удаляю их с помощью LINQ

Проблема в том, что: , даже когда вы просто выбираете строку и удаляете ее, изменение выбора запускается, и эта строка находится в e.RemovedItems (что странно, почему бы просто выбрав что-то, поместите это в контейнер RemovedItems?).

Итак, я ищу событие DeleteKeyPressed , чтобы я мог просто обработать его. Как называется это событие?

Я использую инструментарий марта 2009 года.

XAML:

<Grid DockPanel.Dock="Bottom">
    <toolkit:DataGrid x:Name="TheDataGrid" 
                      SelectionChanged="TheDataGrid_SelectionChanged"
                      AutoGenerateColumns="True"
                      RowEditEnding="TheDataGrid_RowEditEnding"/>

код-за:

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

ОТВЕТ:

Спасибо lnferis, это именно то, что я искал, вот мое законченное событие обработки удаления для сетки данных, обратите внимание, что событие KeyDown по какой-то причине не срабатывает.

XAML:

<toolkit:DataGrid x:Name="TheDataGrid" 
                  KeyDown="TheDataGrid_KeyDown"
                  PreviewKeyDown="TheDataGrid_PreviewKeyDown"
                  AutoGenerateColumns="True"
                  RowEditEnding="TheDataGrid_RowEditEnding"/>

код-за

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

Ответы [ 6 ]

28 голосов
/ 24 марта 2009

Элементы RemovedItems отражают элементы, удаленные из выбора, а не из сетки.

Обработайте событие PreviewKeyDown и используйте свойство SelectedItems для удаления выбранных там строк:

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
        }
    }
}
17 голосов
/ 24 марта 2009

С чем вы связываете свою DataGrid? В идеале вы должны реагировать на события CollectionChanged в коллекции, к которой вы привязываете. Таким образом, ваша логика (удаление удаленных элементов) будет отделена от вашего пользовательского интерфейса.

Вы можете создать коллекцию Observable, содержащую ваши объекты, и привязать ее к ItemsSource только для этой цели, если исходная коллекция не имеет необходимых событий.

Это может не подходить для вашей конкретной настройки, но я обычно так делаю.

14 голосов
/ 17 октября 2015

1001 * XAML *

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

Код позади

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;
  }
}
3 голосов
/ 24 июня 2014

Пожалуйста, следуйте приведенному ниже коду. Мне удалось с приведенным ниже кодом.

Пожалуйста, дайте мне знать, если требуются изменения.

 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);
            }
        }
    }
1 голос
/ 02 сентября 2016

Немного опоздал на вечеринку, но чтобы получить Inferis, ответ:

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 ...

Это исправляет комментарий epalms: «если вы редактируете ячейку и используете клавишу удаления для удаления некоторых символов в ячейке, вы в конечном итоге удалите всю строку»

0 голосов
/ 24 марта 2009

Вы хотите обработать событие KeyUp или KeyDown и проверить нажатую клавишу для удаления.

private void OnKeyDown(object sender, KeyEventArgs e) {
  if ( Key.Delete == e.Key ) {
    // Delete pressed
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...