Удалить строку в WPF DataGrid

#c# #wpf #datagrid

#c# #wpf #datagrid

Вопрос:

У меня есть datagrid со значком удаления в качестве одного столбца и значком обновления в качестве другого столбца. При нажатии кнопки обновить первая ячейка находится в фокусе.

При нажатии на удалить я хочу удалить эту выбранную строку, но я получаю сообщение об ошибке «Операция недопустима, пока используется ItemsSource. Получить доступ к элементам и изменить их с помощью ItemsControl.Вместо этого используется ItemsSource.» со следующим кодом:

XAML:

 <DataGrid Name="grdList" Margin="3,16,0,5" RowHeight="30" ColumnWidth="*"
          ItemsSource="{Binding  List,Mode=TwoWay}" Width="434" 
          AutoGenerateColumns="False" 
          CanUserAddRows="False" AlternatingRowBackground="#FFB9BBFF">
    <DataGrid.Columns>
        <DataGridTextColumn MinWidth="0" Header="Property"
                            Binding="{Binding Path=Property}"/>

        <DataGridTemplateColumn Header="Update"  MinWidth="50" MaxWidth="50">
            <DataGridTemplateColumn.CellStyle>
                <Style TargetType="DataGridCell">
                    <EventSetter Event="PreviewMouseLeftButtonDown"
                                 Handler="EventSetter_OnHandler"/>
                </Style>
            </DataGridTemplateColumn.CellStyle>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Image Source="Icons/Update.jpg"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>

        <DataGridTemplateColumn Header="Delete"  MinWidth="50" MaxWidth="50">
            <DataGridTemplateColumn.CellStyle>
                <Style TargetType="DataGridCell">
                    <EventSetter Event="PreviewMouseLeftButtonDown"
                                 Handler="EventSetter_OnHandler"/>
                </Style>
            </DataGridTemplateColumn.CellStyle>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Image Source="Icons/Delete.jpg"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>
  

C#:

 private void EventSetter_OnHandler(object sender, MouseButtonEventArgs e)
{
    object source = e.OriginalSource;
    if (source.GetType() == typeof(Image))
    {
        grdList.IsReadOnly = false;

        selectedRow = FindParent<DataGridRow>(sender as DependencyObject);

        if (((DataGridCell)sender).Column.Header.ToString().ToUpperInvariant() == "DELETE")
        {
            grdList.Items.Remove(selectedRow);
        }
        else
        {
            DataGridCellsPanel panel = FindVisualChild<DataGridCellsPanel>(selectedRow);

            DataGridCell dgc = panel.Children[0] as DataGridCell; 
            dgc.Focus();
            grdList.BeginEdit();

            e.Handled = true;
        }
    }
}
  

Также как добавить функцию удаления с помощью клавиши «Удалить» вместе с нажатием на ячейку удаления.

Ответ №1:

Я подозреваю, что на Delete т.е. в EventSetter_OnHandler , вы должны удалять элементы из Items коллекции DataGrid. Что-то вроде этого:

 grdList.Items.Remove(someItem);
  

Но поскольку ошибка не требует пояснений

«Операция недопустима, пока используется ItemsSource. Получить доступ к элементам и изменить их с помощью ItemsControl.Вместо этого используется ItemsSource.»

Вы привязали ItemsSource к некоторой коллекции, поэтому вам нужно удалить элемент из нее. Вы не можете изменять коллекцию Items напрямую при привязке ItemsSource к некоторой коллекции. Это должно быть что-то вроде:

 List.Remove(someItem);
  

Комментарии:

1. Спасибо.. Возможно ли запустить параметр удаления по умолчанию в WPF datagrid по щелчку мыши?

Ответ №2:

Вы можете привязать выбранный вами элемент DataGrid к свойству. Затем вы можете вызвать

 List.Remove(SelectedDataGridItem);
  

SelectedDataGridItem — это свойство, к которому привязан выбранный элемент

Ответ №3:

Попробуйте это,

 grdList.Items.RemoveAt(grdList.SelectedIndex);
  

Комментарии:

1. Хотя, вероятно, это хороший ответ, старайтесь избегать ответов только с кодом. Подумайте о добавлении объяснения

2. Имеет те же проблемы, что и ‘Удалить’. Не допускается, если ‘ItemsSource’ привязан к коллекции.

Ответ №4:

У меня была такая же проблема, я решил ее так:

 yourrowbindingobject row = (yourrowbindingobject)yourdatagrid.SelectedItems[0];

ObservableCollection<yourrowbindingobject> data = (ObservableCollection<yourrowbindingobject>)yourdatagrid.ItemsSource;
data.Remove(row);
  

Ответ №5:

У меня была такая же проблема при попытке удалить строку datagrid с помощью нажатия кнопки, я решил ее, как показано ниже:

Строки Datagrid, заполненные данными, полученными из базы данных SQL:

 /* Assign ItemsSource of DataGrid. */
dataGridSupplier.ItemsSource = Ldtbl.DefaultView;

 DataRowView dr = dataGridSupplier.SelectedItem as DataRowView;
 DataRow dr1 = dr.Row;

/* Remove selected item from the datagrid after successfully updating database. */
Ldtbl.Rows.Remove(dr1);