Подтвердить что ты не робот

Что такое событие "нажатие клавиши удаления" для WPat Datagrid?

Я хочу, чтобы пользователь выделил строку в DataGrid 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, это именно то, что я искал, вот мое законченное событие обработки удаления для datagrid, обратите внимание, что событие 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");
}
4b9b3361

Ответ 1

Элементы 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
        }
    }
}

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

Немного поздно вечеринке, но чтобы получить ответ 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: "если вы редактируете ячейку и используете ключ удаления, чтобы удалить некоторые символы в ячейке, вы удалите всю строку"

Ответ 6

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

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