在WPF DataGrid中删除一行

14

我有一个数据网格,其中一列是删除图标,另一列是更新图标。 在单击更新时,第一个单元格会获得焦点。

在单击删除时,我想删除所选行,但是使用以下代码会出现错误“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;
        }
    }
}

同时如何使用"删除"键和单击删除单元格一起添加删除功能。

5个回答

5
我怀疑在EventSetter_OnHandlerDelete时,您必须从dataGrid的Items集合中删除项。类似于这样的代码:
grdList.Items.Remove(someItem);

但是由于该错误本身已经非常明显:

"在使用ItemsSource时,操作无效。请使用ItemsControl.ItemsSource访问和修改元素."

您已将ItemsSource绑定到某个集合上,因此您需要从中删除项目。 当将ItemsSource绑定到某个集合时,不能直接修改Items集合。应该像这样进行:

List.Remove(someItem);

谢谢。在WPF数据网格上单击时,是否可以启动默认的删除选项? - user2480288

2

请尝试以下内容:

grdList.Items.RemoveAt(grdList.SelectedIndex);

1
尽管可能是一个很好的答案,但请避免仅提供代码的回复。考虑添加解释。 - user585968
如果“ItemsSource”绑定到集合,则存在与“Remove”相同的问题,因此不允许使用。 - AndresRohrAtlasInformatik

2

我遇到了同样的问题,我这样解决:

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

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

2
你可以将你的DataGrid的SelectedItem绑定到一个属性上。然后你就可以调用。
List.Remove(SelectedDataGridItem);

SelectedDataGridItem是绑定所选项的属性。


0

当我尝试使用按钮单击删除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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接