我有一个数据网格,其中删除图标为一列,更新图标为另一列。点击更新后,第一个单元格将设置为焦点。
单击删除我想删除所选行,但是我收到错误“当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;
}
}
}
如何使用“删除”键添加删除功能以及单击删除单元格。
答案 0 :(得分:4)
我怀疑 Delete
,即在EventSetter_OnHandler
,您必须从 Items
dataGrid集合中删除项目。像这样:
grdList.Items.Remove(someItem);
但由于错误是自我解释
“正在使用ItemsSource时操作无效。访问和修改 而使用ItemsControl.ItemsSource的元素。“
您已将ItemsSource绑定到某个集合,因此您需要从中删除项目。在将ItemsSource与某些集合绑定时,无法直接修改Items集合。它应该是这样的:
List.Remove(someItem);
答案 1 :(得分:2)
您可以将DataGrid
的SelectedItem绑定到属性。然后你可以打电话
List.Remove(SelectedDataGridItem);
SelectedDataGridItem是Selected Item绑定的属性
答案 2 :(得分:2)
试试这个,
grdList.Items.RemoveAt(grdList.SelectedIndex);
答案 3 :(得分:1)
我遇到了同样的问题,我解决了这个问题:
yourrowbindingobject row = (yourrowbindingobject)yourdatagrid.SelectedItems[0];
ObservableCollection<yourrowbindingobject> data = (ObservableCollection<yourrowbindingobject>)yourdatagrid.ItemsSource;
data.Remove(row);
答案 4 :(得分:0)
我在尝试使用按钮单击删除数据网格行时遇到了同样的问题,我解决了如下问题:
由从 SQL 数据库中检索到的数据填充的 Datagrid 行:
/* 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);