删除WPF DataGrid中的一行

本文关键字:一行 WPF DataGrid 删除 | 更新日期: 2023-09-27 18:11:12

我有一个数据网格,其中删除图标作为一列,更新图标作为另一列。点击更新按钮,第一个单元格被设置为焦点。

点击删除,我想删除选中的行,但我得到错误"操作是无效的,而ItemsSource是在使用。使用ItemsControl访问和修改元素。

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

还有如何添加删除功能与"删除"键一起点击删除单元格。

删除WPF DataGrid中的一行

我怀疑 Delete 即在EventSetter_OnHandler中,您必须从 Items dataGrid集合中删除项目。像这样:

grdList.Items.Remove(someItem);

但是由于错误是不言自明的

"使用ItemsSource时操作无效。访问和修改元素与ItemsControl。ItemsSource代替。"

您已经将ItemsSource绑定到某个集合,因此您需要从中删除项。当将ItemsSource与某些集合绑定时,不能直接修改Items集合。它应该是这样的:

List.Remove(someItem);

您可以将DataGrid的SelectedItem绑定到属性。然后你可以调用

List.Remove(SelectedDataGridItem);

SelectedDataGridItem是被选中的Item绑定到的属性

试试这个,

grdList.Items.RemoveAt(grdList.SelectedIndex);

我有同样的问题,我解决了它:

yourrowbindingobject row = (yourrowbindingobject)yourdatagrid.SelectedItems[0];
ObservableCollection<yourrowbindingobject> data = (ObservableCollection<yourrowbindingobject>)yourdatagrid.ItemsSource;
data.Remove(row);

我有同样的问题时,试图删除数据网格行使用按钮点击,我解决了它如下:

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