在 WPF DataGrid 中删除一行

问题描述 投票:0回答:6

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

单击删除时,我想删除所选行,但收到错误“使用 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;
        }
    }
}

另外如何使用“删除”键以及单击删除单元格来添加删除功能。

c# wpf datagrid
6个回答
5
投票

我怀疑在

Delete
上,即在
EventSetter_OnHandler
中,您必须从 dataGrid 的
Items
集合中删除项目。像这样的东西:

grdList.Items.Remove(someItem);

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

“使用ItemsSource时操作无效。访问并修改 改为使用 ItemsControl.ItemsSource 的元素。”

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

List.Remove(someItem);

2
投票

您可以将

DataGrid
的 SelectedItem 绑定到属性。然后就可以打电话了

List.Remove(SelectedDataGridItem);

SelectedDataGridItem 是所选项目绑定到的属性


2
投票

试试这个,

grdList.Items.RemoveAt(grdList.SelectedIndex);

2
投票

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

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

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

0
投票

当尝试使用按钮单击删除数据网格行时,我遇到了同样的问题,我解决如下:

数据网格行由从 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);

0
投票

我偶然发现了这一点,并通过“刷新”itemSources 列表找到了一个更简单的解决方案。

private void Delete_Click(object sender, RoutedEventArgs e)
{
    for (var visObj = sender as Visual; visObj != null; visObj = VisualTreeHelper.GetParent(visObj) as Visual)
    {
        if (visObj is DataGridRow)
        {
            DataGridRow row = (DataGridRow)visObj;
            int clickedIdx = row.GetIndex();

            // deleting starts here:
            myDataList.RemoveAt(clickedIdx);
            var temp = myDataGrid.ItemsSource;
            myDataGrid.ItemsSource = null;
            myDataGrid.ItemsSource = temp;
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.