Дано: 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/
Добавить комментарий