gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:57:34 27 4
gpt4 key购买 nike

我想让用户突出显示 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/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com