programing

WPF 데이터 그리드의 "삭제 키 누름" 이벤트는 무엇입니까?

showcode 2023. 6. 19. 21:47
반응형

WPF 데이터 그리드의 "삭제 키 누름" 이벤트는 무엇입니까?

사용자가 WPF DataGrid에서 행을 강조 표시하고 delete 키를 눌러 행을 삭제할 수 있도록 합니다.

  • 기능은 이미 그리드의 UI에 내장되어 있으므로 사용자에게 행은 사라집니다.
  • 현재 SelectionChanged 이벤트(아래 코드)에서 이 문제를 처리하고 있습니다.
  • 나는 모든 "e"를 반복합니다.제거된 항목" 및 LINQ를 사용하여 항목 삭제

문제단순히 행을 선택하고 이동하는 경우에도 선택 변경이 실행되고 해당 행이 1이 된다는 것입니다.Removed Items(이상하게도 어떤 항목을 선택하면 Removed Items(제거된 항목) 컨테이너에 넣을 수 있습니다.)

그래서 간단하게 처리할 수 있도록 DeleteKeyPressed 이벤트를 찾고 있습니다.그 행사의 이름은 무엇입니까?

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

답변:

Thanks lnferis, 그게 바로 제가 찾던 것입니다. 여기 데이터 그리드에 대한 완료된 삭제 처리 이벤트가 있습니다. 키다운 이벤트가 어떤 이유로 실행되지 않습니다.

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항목은 그리드가 아닌 선택 항목에서 제거된 항목을 반영합니다.

처리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
        }
    }
}

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

데이터 그리드의 바인딩 대상은 무엇입니까?이상적으로는 바인딩할 컬렉션의 CollectionChanged 이벤트에 대응해야 합니다.이렇게 하면 논리(제거된 항목 삭제)가 UI에서 분리됩니다.

개체를 포함하는 관찰 가능한 컬렉션을 만들고 이를 항목에 바인딩할 수 있습니다.원본 컬렉션에 필요한 이벤트가 없는 경우 해당 용도의 원본입니다.

특정 설정에 맞지 않을 수도 있지만, 저는 보통 그렇게 합니다.

아래의 코드를 따르십시오.저는 아래 코드로 성공했습니다.

변경이 필요하면 알려주시기 바랍니다.

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

파티에 조금 늦었지만 인퍼리스의 대답을 듣기 위해서는:

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

이렇게 하면 "셀을 편집할 때 삭제 키를 사용하여 셀에서 일부 문자를 제거하면 전체 행이 삭제됩니다."라는 설명이 수정됩니다.

가장 깨끗한 솔루션은 플럭스에 의해 응답된 것과 같은 PreviewCanExecute를 사용하는 것입니다. 이것은 저처럼 그의 답변을 간과한 사람들을 위해 조금 더 명확하게 하기 위한 완성된 솔루션입니다.

private void Grid_PreviewCanExecute(object sender, CanExecuteRoutedEventArgs e)
{
    if (e.Command == DataGrid.DeleteCommand)
    {
        if (MessageBox.Show($"Delete something from something else?", "Confirm removal of something", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
        {
            // Do what ever needs to be done when someone deletes the row
        }
        else
        {
            e.Handled = true;   
            // Handled means.. no worries, I took care of it.. and it will not delete the row
        }
    }
}

명령 관리자에 연결할 필요가 없습니다.이 후에 실행됩니다.

Key Up 또는 Key Down 이벤트를 처리하고 누른 Key for Delete(삭제할 키)를 선택합니다.

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

언급URL : https://stackoverflow.com/questions/677326/what-is-the-pressed-the-delete-key-event-for-the-wpf-datagrid

반응형