web-dev-qa-db-fra.com

Supprimer une ligne dans WPF DataGrid

J'ai une grille de données avec une icône de suppression dans une colonne et une icône de mise à jour dans une autre colonne. Au clic de mise à jour, la première cellule est mise au point.

Lorsque je clique sur supprimer, je souhaite supprimer la ligne sélectionnée, mais le message suivant s'affiche: "L'opération n'est pas valide tant que ItemsSource est en cours d'utilisation. Vous pouvez également accéder aux éléments avec ItemsControl.ItemsSource et les modifier." avec le code suivant:

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

Aussi Comment ajouter la fonction de suppression avec la touche "Suppr" avec le clic sur la cellule de suppression.

7
user2480288

Je soupçonne queDeletei.e. dans EventSetter_OnHandler, vous devez supprimer des éléments de la collectionItemsde la collection de données. Quelque chose comme ça:

grdList.Items.Remove(someItem);

Mais comme l'erreur est explicite

"L'opération n'est pas valide tant que ItemsSource est en cours d'utilisation. Vous pouvez également accéder aux éléments avec ItemsControl.ItemsSource et les modifier."

Vous avez lié ItemsSource à une collection, vous devez donc en supprimer un élément. Vous ne pouvez pas modifier directement la collection Items lorsque vous liez ItemsSource avec une collection . Cela devrait être quelque chose comme:

List.Remove(someItem);
3
Rohit Vats

Essaye ça,

grdList.Items.RemoveAt(grdList.SelectedIndex);
2
BIBIN K ONANKUNJU

Vous pouvez lier l'élément SelectedItem de votre DataGrid à une propriété. Ensuite, vous pouvez appeler

List.Remove(SelectedDataGridItem);

SelectedDataGridItem est la propriété à laquelle l'élément sélectionné est lié.

1
Tomtom

J'ai eu le même problème, je l'ai résolu ainsi:

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

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