wpf - WPF Datagrid 的 "pressed the delete key"事件是什么?

标签 wpf datagrid

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

  • 功能已经是内置于 UI 的网格,所以对用户来说,该行消失
  • 我目前在 上处理此问题SelectionChanged 事件 (代码如下)
  • 我遍历所有“e.RemovedItems”并使用 LINQ
  • 删除它们

    问题是:即使您只是简单地选择一行并移开它,也会触发选择更改并且该行位于 e.RemovedItems 中(这很奇怪,为什么简单地选择某些内容将其放入 RemovedItems 容器中?)。

    所以我要找一个删除键已按下 事件,所以我可以简单地处理它。那个事件叫什么?

    我正在使用 2009 年 3 月的工具包。

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

    最佳答案

    RemovedItems items 反射(reflect)了从选择中移除的项目,而不是从网格中移除的项目。

    处理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
            }
        }
    }
    

    关于wpf - WPF Datagrid 的 "pressed the delete key"事件是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/677326/

    相关文章:

    WPF:圆形进度条

    java - ASPxGridView java 的替代品?

    python - ImageGrid 中每一行的颜色条

    c# - 单击按钮更新 wpf 数据网格

    c# - C# 代码背后的数据绑定(bind)

    c# - 没有选项卡的 WPF 选项卡控件

    c# - 在 wpf 数据网格中对所有行进行排序后触发哪个事件。

    c# - WPF Datagrid 单元格按钮图像未显示

    c# - 您如何正确测试 MVVM 中的 View ?

    C#:如何在虚拟模式下有效地过滤(隐藏)ListView 项目?