当前位置:  开发笔记 > 运维 > 正文

什么是WPF Datagrid的"按下删除键"事件?

如何解决《什么是WPFDatagrid的"按下删除键"事件?》经验,为你挑选了3个好方法。

我想让用户突出显示WPF DataGrid上的一行,然后按删除键删除该行.

该功能已内置于网格的UI中,因此对用户而言,该行将消失

我目前在SelectionChanged事件上处理这个问题(下面的代码)

我遍历所有"e.RemovedItems"并用LINQ删除它们

问题是:即使您只是选择一行并离开它,也会触发选择更改,并且该行位于e.RemovedItems中(这很奇怪,为什么只是选择将它放在RemovedItems容器中?).

所以我正在寻找一个DeleteKeyPressed事件,所以我可以简单地处理它.那个事件叫什么?

我使用的是2009年3月的工具包.

XAML:


    

后台代码:

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:


代码隐藏

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

Inferis.. 30

这些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
        }
    }
}

这不是很好,如果您正在编辑单元格并使用删除键删除单元格中的某些字符,您最终将删除整行. (18认同)

是否有一个原因DataGrid不只是有一个RowsDeleted事件?默认情况下,WPF会在您按删除键时以图形方式删除该行.因此,它已经在执行此逻辑并循环删除已删除的行.为什么他们不能只添加一个事件处理程序,以便我不必复制此代码和检查键. (4认同)

@epalm如果你在`if(grid.SelectedItems.Count> 0)里面添加`foreach`代码`就像Edward Tanguay那样,那么一切都应该有效.但感谢你指出来! (2认同)


Denis Trolle.. 17

你将DataGrid绑定到什么?理想情况下,您应该对要绑定的集合上的CollectionChanged事件做出反应.这样,您的逻辑(删除已删除的项目)将与您的UI分离.

如果原始集合没有必要的事件,您可以构建一个包含对象的Observable集合,并将其绑定到ItemsSource.

它可能不适合您的具体设置,但这就是我通常的做法.



1> Inferis..:

这些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
        }
    }
}


这不是很好,如果您正在编辑单元格并使用删除键删除单元格中的某些字符,您最终将删除整行.
是否有一个原因DataGrid不只是有一个RowsDeleted事件?默认情况下,WPF会在您按删除键时以图形方式删除该行.因此,它已经在执行此逻辑并循环删除已删除的行.为什么他们不能只添加一个事件处理程序,以便我不必复制此代码和检查键.
@epalm如果你在`if(grid.SelectedItems.Count> 0)里面添加`foreach`代码`就像Edward Tanguay那样,那么一切都应该有效.但感谢你指出来!

2> Denis Trolle..:

你将DataGrid绑定到什么?理想情况下,您应该对要绑定的集合上的CollectionChanged事件做出反应.这样,您的逻辑(删除已删除的项目)将与您的UI分离.

如果原始集合没有必要的事件,您可以构建一个包含对象的Observable集合,并将其绑定到ItemsSource.

它可能不适合您的具体设置,但这就是我通常的做法.



3> flux..:

XAML


代码背后

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

推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有