【问题标题】:Delete a row in WPF DataGrid删除 WPF DataGrid 中的一行
【发布时间】:2014-08-22 11:03:58
【问题描述】:

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

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

还有如何通过“Delete”键以及单击删除单元格来添加删除功能。

【问题讨论】:

    标签: c# wpf datagrid


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        试试这个,

        grdList.Items.RemoveAt(grdList.SelectedIndex);
        

        【讨论】:

        • 虽然可能是一个不错的答案,但请尽量避免仅代码响应。考虑添加解释
        • 与“删除”有同样的问题。如果 'ItemsSource' 绑定到集合,则不允许。
        【解决方案4】:

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

        List.Remove(SelectedDataGridItem);
        

        SelectedDataGridItem 是选定项绑定到的属性

        【讨论】:

          【解决方案5】:

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

          grdList.Items.Remove(someItem);
          

          但由于错误是不言自明的

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

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

          List.Remove(someItem);
          

          【讨论】:

          • 谢谢.. 是否可以在点击时启动 WPF 数据网格中的默认删除选项?
          猜你喜欢
          • 2023-03-24
          • 2012-05-20
          • 1970-01-01
          • 2018-07-09
          • 1970-01-01
          • 1970-01-01
          • 2011-09-17
          • 1970-01-01
          • 2014-12-17
          相关资源
          最近更新 更多