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.
Je soupçonne queDelete
i.e. dans EventSetter_OnHandler
, vous devez supprimer des éléments de la collectionItems
de 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);
Essaye ça,
grdList.Items.RemoveAt(grdList.SelectedIndex);
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é.
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);