Обновить DataGrid после DELETE ( WPF )

от автора

Дано: WPF приложение для редактирования данных некой таблицы в некоторой базе данных.
Требуется: сделать так что бы это работало как задумано ( с помощью Visual Studio 2015 ).
Затык: После нажатия кнопки «Удалить» строка грида остаётся на месте — не удаляется.

Начало

Сделал всё по учебнику ( "Пошаговое руководство. Привязка элементов управления WPF к набору данных" ).
И всё работало и было хорошо, пока я не добавил кнопку «DELETE».

meteoStationsReferenceTableAdapter.Delete(recordIndex); 

Корень зла

Пошаговое руководство ни чего о кнопке «Удалить» не говорило, её добавление стало причиной всех бед.
Начались странности:

  • открываешь приложение
  • в DataGrid автоматически подгружается табличка
  • нажимаешь кнопку «DELETE»
  • а ни чего не происходит!

Если переоткрыть приложение, то да, запись отсутствует — то есть запись была удалена, но DataGrid этого не отрисовал.

Поиск решения

Поискал у DataGrid в методах «Refresh» и на удивление ни чего похожего не нашёл.
Спросил у Гугла «refresh datagrid wpf c#».

Сбросить ItemsSource

1) How to refresh datagrid in WPF

myGrid.ItemsSource = null; myGrid.ItemsSource = myDataSource; 

Присваивания ItemsSource я ни где не писал, и я был без понятия где бы такое могло быть — такой вариант не годился.

<DataGrid x:Name="MeteoStationsReferenceDataGrid" AutoGenerateColumns="False" EnableRowVirtualization="True" ItemsSource="{Binding}" Margin="0,52,9.6,10" RowDetailsVisibilityMode="VisibleWhenSelected" CanUserReorderColumns="False"> 	<DataGrid.Columns> 		<DataGridTextColumn x:Name="IdColumn" Binding="{Binding id}" Header="id" Width="SizeToHeader"/> 		<DataGridTextColumn x:Name="NameColumn" Binding="{Binding name}" Header="name" Width="SizeToHeader"/> 		<DataGridTextColumn x:Name="DescriptionColumn" Binding="{Binding description}" Header="description" Width="SizeToHeader"/> 	</DataGrid.Columns> </DataGrid> 

ItemsSource="{Binding}"

ни какого ItemsSource.

Обновить отображение

2) [WPF] Обновление DataGrid
Предлагается два варианта, первый:

this.TransactionsDataGrid.ItemsSource = null; this.TransactionsDataGrid.ItemsSource = DataProvider.Instance.GetTransactions(); 

Где у меня DataProvider и что бы это такое могло быть я снова был без понятия.
Второй вариант:

CollectionViewSource.GetDefaultView(TransactionsDataGrid.ItemsSource).Refresh(); 

Это было уже понятней, я попробовал:

проверка решения

var meteoStationsReferenceDataGrid = this.MeteoStationsReferenceDataGrid; if (meteoStationsReferenceDataGrid?.ItemsSource != null) { 	var collectionView = CollectionViewSource.GetDefaultView( 		meteoStationsReferenceDataGrid.ItemsSource); 	collectionView?.Refresh(); } 

Ни чего не изменилось — желанного результата не получилось, ок, продолжим поиски.
Сколько я не искал везде был вариант со сбросом и присваиванием ItemsSource. Ещё был вариант с "INotifyPropertyChanged Interface", но для меня это совсем дремучий лес.

Решение

Я продолжал поиски, пока Фортуна не улыбнулась мне, подсунув ссылку [RESOLVED] Refresh DataGridView after adding/deleting records, где было чёрным по белому написано:

Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSave.Click  '----------------------------------------------------------------------------  	 	Dim newRow = DirectCast(ProduseBindingSource.AddNew(), DataRowView) 	newRow("pret") = Pret.Text 	ProduseBindingSource.EndEdit() 	Me.ProduseTableAdapter.Update(Me.Database1DataSet1)       End Sub 

И тут до меня доехало, что данные надо перечитать, в смысле залить по новой:

/* Удаляем запись */ meteoStationsReferenceTableAdapter.Delete(recordIndex); /* Флаг ClearBeforeFill наверное надо установить на инициализации формы */ meteoStationsReferenceTableAdapter.ClearBeforeFill = true ; var meteoStationsReferenceDataSet = this._meteoStationsReferenceDataSet ; if ( meteoStationsReferenceDataSet != null ) { /* читаем данные */ 	meteoStationsReferenceTableAdapter.Fill 		( 			meteoStationsReferenceDataSet.meteo_stations_reference ) ; } 

Проверил — получилось.
На мой вкус повторное чтение набора данных это более «цивилизованный» способ чем сброс и установка ItemsSource.
PS
С WPF я так и не подружился.

ссылка на оригинал статьи https://habrahabr.ru/post/279011/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *