#c# #wpf #datagrid
#c# #wpf #datagrid
Вопрос:
У меня есть datagrid со значком удаления в качестве одного столбца и значком обновления в качестве другого столбца. При нажатии кнопки обновить первая ячейка находится в фокусе.
При нажатии на удалить я хочу удалить эту выбранную строку, но я получаю сообщение об ошибке «Операция недопустима, пока используется 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;
}
}
}
Также как добавить функцию удаления с помощью клавиши «Удалить» вместе с нажатием на ячейку удаления.
Ответ №1:
Я подозреваю, что на Delete
т.е. в EventSetter_OnHandler
, вы должны удалять элементы из Items
коллекции DataGrid. Что-то вроде этого:
grdList.Items.Remove(someItem);
Но поскольку ошибка не требует пояснений
«Операция недопустима, пока используется ItemsSource. Получить доступ к элементам и изменить их с помощью ItemsControl.Вместо этого используется ItemsSource.»
Вы привязали ItemsSource к некоторой коллекции, поэтому вам нужно удалить элемент из нее. Вы не можете изменять коллекцию Items напрямую при привязке ItemsSource к некоторой коллекции. Это должно быть что-то вроде:
List.Remove(someItem);
Комментарии:
1. Спасибо.. Возможно ли запустить параметр удаления по умолчанию в WPF datagrid по щелчку мыши?
Ответ №2:
Вы можете привязать выбранный вами элемент DataGrid
к свойству. Затем вы можете вызвать
List.Remove(SelectedDataGridItem);
SelectedDataGridItem — это свойство, к которому привязан выбранный элемент
Ответ №3:
Попробуйте это,
grdList.Items.RemoveAt(grdList.SelectedIndex);
Комментарии:
1. Хотя, вероятно, это хороший ответ, старайтесь избегать ответов только с кодом. Подумайте о добавлении объяснения
2. Имеет те же проблемы, что и ‘Удалить’. Не допускается, если ‘ItemsSource’ привязан к коллекции.
Ответ №4:
У меня была такая же проблема, я решил ее так:
yourrowbindingobject row = (yourrowbindingobject)yourdatagrid.SelectedItems[0];
ObservableCollection<yourrowbindingobject> data = (ObservableCollection<yourrowbindingobject>)yourdatagrid.ItemsSource;
data.Remove(row);
Ответ №5:
У меня была такая же проблема при попытке удалить строку 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);